2016-09-02 30 views
1

背景GCC gprof的/ gcov的/其他 - 如何获得函数调用序列/出口+控制流语句

我们有我们的嵌入式GUI产品测试,当测试者宣称“测试失败”,有时它是很难让我们的开发人员重现确切的问题,因为我们没有确切的发生的事情。

我们目前有一个日志框架,但我们开发人员必须在代码中手动输入这些日志语句,这很好。 。 。除非发生难以重现的错误,并且我们在“正确”位置没有记录声明,然后重新构建时,使用相同步骤重新运行测试,我们会得到不同的结果。

发行

愿我们的解决方案,其中编译器生成额外的仪器代码,让我们看到确切的序列事件包括,在最低

  1. 功能输入/退出(已由-finstrument-functions提供)
  2. 控制流程语句输入即输入if/else,哪个案例状态换货我们跃升为

日志是这样的:

int main() entered 
if-line 5 entered 
else-line 10 entered 
void EventLoop() entered 
. . . 

一些其他可有可无的富人是

在函数入口
  • 参数值AND出口(用于通按引用类型)
  • 函数返回值
  • 问题

    是否有任何gcc工具,甚至支付工具,可以自动执行此仪器?

    +0

    听起来好像你需要一个调试器 – EOF

    +0

    @EOF我们有一个调试器调试器不会记录这个调试器te跟踪。但即使这样做,我们也希望能够在不使用调试器的情况下跟踪 – Adrian

    +0

    除非您有很多尾部调用优化,否则堆栈跟踪应该为您提供所需的调用顺序。也许你可以通过发送适当的信号让测试人员产生一个coredump? – EOF

    回答

    1

    您可以使用gdb的是什么,以及你可以自动执行(我已经得到了一个工具,在作品中,你会发现它here或者你可以尝试使用gcov的。

    的gcov的实现但是:你可以手动转储和加载数据,如果调用__gcov_flush它将转储当前数据并重置当前状态,但是:如果你多次执行这些操作它总是会合并数据,所以你还需要重命名gcov数据文件然后

    +0

    这是否需要测试人员与gdb命令进行交互?我需要这对测试人员来说是完全透明的,即测试人员只需在测试后执行“获取日志”命令即可。 – Adrian

    +0

    是的,没有。这件事是基于插件的。所以你写了一个在特定断点处激活的插件,然后你可以用gdb自动进行交互。 你可以找到目前实现的东西[这里](https://github.com/mw-sc/mw.gdb-runner#frame) 我主要用它来在非EABI控制器上存储系统调用,以这种方式获取数据。但如果你想扩大这一点,我会很乐意接受PR并帮助你。给我写邮件。 –

    相关问题