2012-02-23 73 views
8

我在嵌入式系统上有一个很老的C代码的大代码库,很遗憾没有自动化的测试用例/套件。这使得重构和重构代码成为一项危险的任务。C函数调用和参数跟踪 - 测试用例和模拟生成

手动编写测试用例非常耗时,所以我认为应该可以通过跟踪所有函数调用和记录输入和输出值来自动执行此过程的至少一部分。然后,我可以在测试用例中使用这些值(除了某些函数,这不适用于所有测试)。根据收集的数据也可能创建模拟函数。

拥有这样的测试用例会使重构成为一个不太危险的活动。

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

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

+0

你不觉得这个问题属于superuser.com ...? – 2012-02-23 15:12:17

+2

@ Mr.32:这是一个与编程高度相关的问题,所以它绝对属于这里。 – 2012-02-23 15:39:50

回答

1

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

谷歌它,你可以找到很多很好的例子。

[编辑]有了这个gcc选项的回调函数,你只能跟踪函数的入口/出口,而不是参数。但用一些技巧你也可以追踪这些参数。 (遍历当前帧指针以获取栈上的参数)。

这是一篇文章谈的执行理念:

http://linuxgazette.net/151/melinte.html

此外,取决于您的嵌入式系统,在Linux上,你可以尝试这样ltrace展现PARAMS(如strace的方式)。在linux上的用户空间或kernelspace上,函数跟踪有很多工具可用,ftrace/ust/ltrace/utrace/strace/systemtap /。无论如何,如果你不添加任何硬性调试代码,就不可能以正确的方式显示参数。如果您接受添加入口/出口调试信息的努力,那么它更容易。

另外这里是一个类似的线程讨论这个问题。

Tool to trace local function calls in Linux

+0

这是非常有趣的,但不幸的是,我不明白我将如何能够访问和存储原始函数参数和返回值。这个编译器扩展甚至可能吗? – trenki 2012-02-23 19:42:37

+0

谢谢。我必须看看我是否可以将它用于MIPS处理器。 – trenki 2012-02-27 07:06:17