【发布时间】:2012-03-25 16:41:11
【问题描述】:
这已经在我的列表中等待了很长时间。简而言之 - 我需要运行 mocked_dummy() 代替 dummy() ON RUN-TIME,而不修改 factorial()。我不在乎软件的入口点。我可以添加任意数量的附加功能(但不能修改/*---- do not modify ----*/ 中的代码)。
我为什么需要这个?
对一些遗留 C 模块进行单元测试。我知道有很多可用的工具,但如果可以进行运行时模拟,我可以改变我的 UT 方法(添加可重用组件)让我的生活更轻松:)。
平台/环境?
Linux、ARM、gcc。
我正在尝试的方法?
- 我知道 GDB 使用陷阱/非法指令来添加断点 (gdb internals)。
- 使代码可自行修改。
- 将
dummy()代码段替换为非法指令,并返回立即作为下一条指令。 - 控制转移到陷阱处理程序。
- 陷阱处理程序是一个可重用的函数,它从 unix 域套接字读取。
-
mocked_dummy()函数的地址已传递(从映射文件中读取)。 - 模拟函数执行。
从这里开始会有问题。我还发现这种方法很乏味,并且需要大量的编码,有些还需要汇编。
我还发现,在 gcc 下,每个函数调用都可以是 hooked / instrumented,但又不是很有用,因为要模拟的函数无论如何都会被执行。
我还有其他方法可以使用吗?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
}
dummy();
return fact;
}
/*---- do not modify ----*/
int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}
【问题讨论】: