2011-12-09 74 views
0

有没有什么办法以编程方式模拟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(); 
} 

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

+0

你问这个干什么? –

回答

1

你总是可以使文本段的某些部分修改通过适当调用mprotect并覆盖一些代码,使你自己的(例如,通过生成机器代码libjit,GNU闪电,...或手动)。

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

如果函数是一个共享库中,你甚至可以覆盖其Procedure Linkage Table(另见ABI spec,这取决于建筑 - 这里是一个ARM

+0

我还没有尝试你的方法,但看起来合适。所以接受你的答案。 – Kamath

+0

好吧不,我不能使用PLT我的代码是静态链接的。 – Kamath

4

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

#define BLAH 0 
#define FOO 1 
void (*table_function[])(void) = {someBlah, someFoo}; 

如果它们都具有相同的接口和返回类型,则可以通过切换表条目来切换它们。

然后你通过执行

table_function[BLAH](); 

如果你想换一个函数调用一个函数,只说

table_function[BLAH] = otherBlah; 

另外:除非你正在写某种JIT的不这样做编译环境或虚拟机,通常你不需要这样的结构,如果你需要它们,你可能会遇到糟糕的架构日。

虽然如果您有面向对象设计的经验,那么您可以用C这种方式设计多态构造(如果没有意义,就忽略它)。

+0

或实现虚拟表:) –

+0

我不能改变在我们的例子中的父功能的实现它的“main()” – Kamath

+0

没有我的问题与VM/OO设计没有关系,我们正试图想出一个平台单元测试,所以要求是模拟,但在运行时。 – Kamath

0

我这样做的另一个方法是:

#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(); 
} 
+0

注意问题的第二行:“...在运行时”。 – pmod

+0

@pmod哎呀,错过了。 – Jeff

1

有对于C.一些嘲讽框架

在工作中,我们在cgreen上取得了一些成功,但是我们必须对其内部进行更改。幸运的是,它非常小,并且相对容易扩展。替代方案看起来不错,但我没有使用,是UnityCMock的组合。

关于单元测试嵌入式C代码的一般话题,我强烈推荐Test Driven Development for Embedded C

相关问题