是否有任何方法可以通过编程模拟在linux上运行的嵌入式c应用程序的函数?在下面的例子中,我想模拟main在运行时调用someBlah
而不是someFunc
。
#include <stdio.h>
void someFunc( void )
{
printf("%s():%dn",__func__,__LINE__);
}
void someBlah( void )
{
printf("%s():%dn",__func__,__LINE__);
}
int main(void)
{
someFunc();
}
程序将在Linux中从ram执行,因此文本段应该是可修改的。我知道GDB在一些类似的概念上工作,其中断点代码位置被陷阱指令取代。
当然,只要做一个函数指针表。
#define BLAH 0
#define FOO 1
void (*table_function[])(void) = {someBlah, someFoo};
如果它们都有相同的接口和返回类型,您可以通过切换表项来切换它们。
然后通过执行
调用函数table_function[BLAH]();
如果你想交换一个函数,只需说
table_function[BLAH] = otherBlah;
另外:不要这样做,除非你正在编写某种jit编译环境或虚拟机,通常你不需要这样的结构,如果你需要它们,你可能有一个糟糕的架构。
虽然如果你在OO设计方面有经验,你可以用这种方式在C语言中设计多态结构(如果没有意义,忽略这个)。
您总是可以通过适当调用mprotect来修改文本段的某些部分,并用您自己的代码覆盖一些代码(例如通过使用libjit, GNU lightning,…或手动)。
但是使用函数指针是一种更简洁的方式。
如果函数在共享库中,您甚至可以覆盖它的过程链接表(参见ABI规范,这取决于体系结构-这里是ARM的)
有一些c语言的mock框架。
在工作中,我们在绿色方面取得了一些成功,但我们必须对其内部进行更改。幸运的是,它非常小,因此相对容易扩展。另一种看起来不错,但我没有使用过的选择是Unity和CMock的组合。
关于嵌入式C代码单元测试的一般主题,我强烈推荐Test Driven Development for embedded C。
我的另一种方法是:
#include <stdio.h>
#define DEBUG
void someFunc( void )
{
#ifndef DEBUG
printf("%s():%dn",__func__,__LINE__);
#else
printf("%s():%dn",__func__,__LINE__);
#endif
}
int main(void)
{
someFunc();
}
看看CMocka,有一篇关于LWN上的mock的文章:用C中的mock对象进行单元测试