C 以编程方式模拟函数
是否有任何方法可以通过编程方式模拟运行在linux上的嵌入式c应用程序的函数。在下面的示例中,我想模拟main在运行时调用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
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设计无关,我们正试图提出一个平台单元测试,所以要求是在运行时模拟。我还没有尝试你的方法,但它看起来很合适。所以接受你的答案。我还没有尝试你的方法,但它看起来很合适。所以接受你的答案。