C函数调用和参数跟踪-测试用例和模拟生成

C函数调用和参数跟踪-测试用例和模拟生成,c,unit-testing,mocking,trace,C,Unit Testing,Mocking,Trace,我在嵌入式系统上有一个很大的C代码库,不幸的是没有自动测试用例/套件。这使得重构和重构代码成为一项危险的任务 手动编写测试用例非常耗时,因此我认为至少可以自动化这个过程的某些部分,例如通过跟踪所有函数调用和记录输入和输出值。然后我可以在测试用例中使用这些值(这不适用于所有函数,但至少适用于某些函数)。还可能基于收集的数据创建模拟函数 有了这样的测试用例,重构就不那么危险了 有什么解决方案可以做到这一点吗?如果我必须自己编写代码,那么最简单的方法是什么 我考虑使用ctags查找函数定义,并将它们包

我在嵌入式系统上有一个很大的C代码库,不幸的是没有自动测试用例/套件。这使得重构和重构代码成为一项危险的任务

手动编写测试用例非常耗时,因此我认为至少可以自动化这个过程的某些部分,例如通过跟踪所有函数调用和记录输入和输出值。然后我可以在测试用例中使用这些值(这不适用于所有函数,但至少适用于某些函数)。还可能基于收集的数据创建模拟函数

有了这样的测试用例,重构就不那么危险了

有什么解决方案可以做到这一点吗?如果我必须自己编写代码,那么最简单的方法是什么

我考虑使用
ctags
查找函数定义,并将它们包装到记录参数值的函数中。另一种可能是gcc编译器插件。

有一个gcc选项“-finstrument functions”,您可以使用该机制为每个函数的入口/出口定义自己的回调

谷歌搜索一下,你会发现很多好的例子

[编辑]通过此gcc选项的回调,您只能跟踪函数的进入/退出,而不能跟踪参数。但是,通过一些技巧,你也可以跟踪参数。(遍历当前帧指针以获取堆栈上的参数)

以下是一篇文章,讨论实施的想法:

此外,取决于您的嵌入式系统,在linux上,您可以尝试类似ltrace的方式来显示参数(如strace方式)。linux上有许多工具在用户空间或内核空间中执行函数跟踪工作,ftrace/ust/ltrace/utrace/strace/systemtap/。无论如何,如果不添加任何硬调试代码,就不可能以正确的方式显示参数。如果您接受添加进入/退出调试信息的努力,那么就容易多了

这里还有一个类似的线程讨论这个问题


你不认为这个问题属于superuser.com吗…??@Mr.32:这是一个与编程高度相关的问题,因此它肯定属于这里。这很有趣,但不幸的是,我不知道如何访问和存储原始函数参数和返回值。有了这个编译器扩展,这可能吗?谢谢。我必须看看我是否能让它为MIPS处理器工作。