通过编程模拟函数



是否有任何方法可以通过编程模拟在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对象进行单元测试

最新更新