Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以编程方式模拟函数_C_Linux_Embedded_Linux Kernel - Fatal编程技术网

C 以编程方式模拟函数

C 以编程方式模拟函数,c,linux,embedded,linux-kernel,C,Linux,Embedded,Linux Kernel,是否有任何方法可以通过编程方式模拟运行在linux上的嵌入式c应用程序的函数。在下面的示例中,我想模拟main在运行时调用someBlah,而不是someFunc #include <stdio.h> void someFunc( void ) { printf("%s():%d\n",__func__,__LINE__); } void someBlah( void ) { printf("%s():%d\n",__func__,__LINE__); } in

是否有任何方法可以通过编程方式模拟运行在linux上的嵌入式c应用程序的函数。在下面的示例中,我想模拟main在运行时调用
someBlah
,而不是
someFunc

#include <stdio.h>

void someFunc( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

void someBlah( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

int main(void)
{
    someFunc();
}
#包括
void someFunc(void)
{
printf(“%s():%d\n”,函数,行);
}
虚空某物(虚空)
{
printf(“%s():%d\n”,函数,行);
}
内部主(空)
{
someFunc();
}

该程序将在Linux中从ram执行,因此文本段应该是可修改的。我知道GDB在一些类似的概念上工作,断点代码位置被陷阱指令取代。

当然,只需制作一个函数指针表即可

#define BLAH 0
#define FOO 1
void (*table_function[])(void) = {someBlah, someFoo};
如果它们都有相同的接口和返回类型,您可以通过切换表条目来切换它们

然后通过执行

table_function[BLAH]();
如果你想交换一个函数,只要说

table_function[BLAH] = otherBlah;
另外:除非您正在编写某种JIT编译环境或VM,否则不要这样做,通常您不需要这样的构造,如果您需要它们,您可能会遇到糟糕的体系结构


虽然如果你在OO设计方面有经验,你可以用C语言设计多态结构(如果没有意义,请忽略这个)。

当然,只需制作一个函数指针表即可

#define BLAH 0
#define FOO 1
void (*table_function[])(void) = {someBlah, someFoo};
如果它们都有相同的接口和返回类型,您可以通过切换表条目来切换它们

然后通过执行

table_function[BLAH]();
如果你想交换一个函数,只要说

table_function[BLAH] = otherBlah;
另外:除非您正在编写某种JIT编译环境或VM,否则不要这样做,通常您不需要这样的构造,如果您需要它们,您可能会遇到糟糕的体系结构


尽管如果你在OO设计方面有经验,你可以用C语言设计多态结构(如果没有意义,请忽略这一点)。

我做这件事的另一种方法是:

#include <stdio.h>
#define DEBUG

void someFunc( void )
{
#ifndef DEBUG
    printf("%s():%d\n",__func__,__LINE__);
#else
    printf("%s():%d\n",__func__,__LINE__);
#endif
}

int main(void) 
{
    someFunc();
}
#包括
#定义调试
void someFunc(void)
{
#ifndef调试
printf(“%s():%d\n”,函数,行);
#否则
printf(“%s():%d\n”,函数,行);
#恩迪夫
}
内部主(空)
{
someFunc();
}

另一种方法是:

#include <stdio.h>
#define DEBUG

void someFunc( void )
{
#ifndef DEBUG
    printf("%s():%d\n",__func__,__LINE__);
#else
    printf("%s():%d\n",__func__,__LINE__);
#endif
}

int main(void) 
{
    someFunc();
}
#包括
#定义调试
void someFunc(void)
{
#ifndef调试
printf(“%s():%d\n”,函数,行);
#否则
printf(“%s():%d\n”,函数,行);
#恩迪夫
}
内部主(空)
{
someFunc();
}

您始终可以通过适当的调用使文本段的某些部分可修改,并使用自己的代码覆盖某些代码(例如,使用libjit、GNU lightning……或手动生成机器代码)

但是使用函数指针是一种更干净的方法


如果函数位于共享库中,您甚至可以覆盖其(另请参见,这取决于体系结构-这里是一个用于)

您始终可以通过适当的调用修改文本段的某些部分,并用自己的代码覆盖某些代码(例如,通过使用libjit、GNU lightning……或手动生成机器代码)

但是使用函数指针是一种更干净的方法


如果函数在共享库中,您甚至可以覆盖它的(另请参见,这取决于体系结构-这里是一个)

C有一些模拟框架

在工作中,我们已经取得了一些成功,但我们确实必须对其内部进行更改。幸运的是,它非常小,因此相对容易扩展。另一种看起来不错,但我没有使用过的方法是和的组合


关于单元测试嵌入式C代码的一般主题,我强烈推荐。

有一些C模拟框架

在工作中,我们已经取得了一些成功,但我们确实必须对其内部进行更改。幸运的是,它非常小,因此相对容易扩展。另一种看起来不错,但我没有使用过的方法是和的组合


关于单元测试嵌入式C代码的一般主题,我强烈推荐。

看一看CMocka,有一篇关于LWN上的模拟的文章:

看一看CMocka,有一篇关于LWN上的模拟的文章:

或实现虚拟表:)在我们的例子中,我不能更改父函数的实现,即“main()不,我的问题与VM/OO设计无关,我们正试图提出一个平台单元测试,因此要求在运行时模拟。或实现虚拟表:)我无法更改父函数中的实现,在我们的情况下,它的“main()”不,我的问题与VM/OO设计无关,我们正试图提出一个平台单元测试,所以要求是在运行时模拟。我还没有尝试你的方法,但它看起来很合适。所以接受你的答案。我还没有尝试你的方法,但它看起来很合适。所以接受你的答案。