相关疑难解决方法(0)

在C中运行时模拟?

这已经在我的列表中待了很长时间.简而言之 - 我需要mocked_dummy()dummy() ON RUN-TIME的位置运行,而无需修改factorial().我不关心软件的切入点.我可以添加任意数量的附加功能(但不能修改其中的代码/*---- do not modify ----*/).

我为什么需要这个?
对一些传统C模块进行单元测试.我知道有很多可用的工具,但如果可以运行时模拟我可以改变我的UT方法(添加可重用的组件)让我的生活更轻松:).

平台/环境?
Linux,ARM,gcc.

我正在尝试的方法?

  • 我知道GDB使用陷阱/非法指令来添加断点(gdb内部).
  • 使代码可自行修改.
  • dummy()用非法指令替换代码段,并作为紧接的下一条指令返回.
  • 控制转移到陷阱处理程序.
  • 陷阱处理程序是一个可重用的函数,它从unix域套接字读取.
  • mocked_dummy()传递函数的地址(从映射文件中读取).
  • 模拟函数执行.

从这里开始存在问题.我还发现这种方法很繁琐,需要大量的编码,有些也在组装中.

我还发现,在gcc下,每个函数调用都可以被挂钩/检测,但同样不是很有用,因为该函数是用来模拟的,无论如何都会被执行.

我还能使用其他方法吗?

#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--;
    } …
Run Code Online (Sandbox Code Playgroud)

c gdb arm mocking

9
推荐指数
2
解决办法
1692
查看次数

标签 统计

arm ×1

c ×1

gdb ×1

mocking ×1