调试:跟踪(和差异)函数调用树的同一程序的两个版本

时间:2012-11-21 15:06:22

标签: c++ debugging gdb trace callgrind

我正在努力改写一些 c ++ cmd行程序中的代码。

我 改变了低级数据结构 它使用,新版本通过所有 没有任何测试(相当多) 问题,我得到了正确的输出 从新版本和旧版本... 但是,当给予某些输入时,他们会给出 不同的行为。

达到目的:在某种程度上 一个大项目,我没有任何线索 如何追踪执行时 流动发散,所以......有办法追踪 函数调用树(可能排除 std call),我不知道,行 源文件和源中的数字 名称? 也许一些gcc或宏观功夫?

我需要一个Linux解决方案,因为那是程序运行的地方。

1 个答案:

答案 0 :(得分:0)

  

但是,当给出某些输入时,它们会给出不同的行为

我会扩展新版本和新版本的日志记录,以便了解certain input算法的更好工作。当它变得更清晰时,你可以使用gdb,如果你仍然需要它。

<强>更新

好的,至于我记录是可以的,但你不想添加它。

另一种方法是追踪。实际上我只在Solaris上使用它,但我发现它也存在于Linux上。我没有在Linux上使用过它,所以你可以测试一下这个想法。

您可以使用SystemTap

  

用户空间探测
SystemTap最初专注于内核空间探测。但是,有许多用户空间探测的情况   帮助诊断问题。 SystemTap 0.6增加了支持以允许探测   用户空间进程。 SystemTap包括对探测条目的支持   进入并从用户空间进程中的函数返回,探测   用户空间代码中的预定义标记,以及监视用户进程   事件

我可以保证它会起作用,但为什么不试一试呢?

文档中甚至有一个例子:

  

如果你想看看如何调用函数xmalloc函数   通过命令ls,您可以使用用户空间回溯功能   提供这些信息。

stap -d /bin/ls --ldd \
-e 'probe process("ls").function("xmalloc") {print_ustack(ubacktrace())}' \
-c "ls /"