dummy()
的位置上运行mocked_dummy()
,而不修改factorial()
。我不关心软件的入口点。我可以添加任意数量的额外函数(但不能修改/*---- do not modify ----*/
内的代码)。为什么我需要这个?
为了对一些传统的C模块进行单元测试。我知道周围有很多可用的工具,但如果可以进行运行时 mocking,我可以改变我的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;
}