C++ 调试:跟踪(并区分)同一程序的两个版本的函数调用树

C++ 调试:跟踪(并区分)同一程序的两个版本的函数调用树,c++,debugging,gdb,trace,callgrind,C++,Debugging,Gdb,Trace,Callgrind,我正在重写一些 代码在C++ CMD线程序中。 我 更改了 它使用并且新版本通过了所有测试 测试(相当多)没有任何限制 问题,我得到正确的输出 从新版本和旧版本。。。 尽管如此,当给出某些输入时,他们还是会给出 不同的行为 切中要害:有点 一个我一无所知的大项目 如何追踪执行时间 水流发散,所以。。。有办法追踪吗 函数调用树(可能不包括 std电话)以及,我不知道,线路 源文件和源文件中的编号 名称 也许是一些gcc或宏观功夫 我需要一个Linux解决方案,因为这是程序运行的地方 尽管如此,当给

我正在重写一些 代码在C++ CMD线程序中。

我 更改了 它使用并且新版本通过了所有测试 测试(相当多)没有任何限制 问题,我得到正确的输出 从新版本和旧版本。。。 尽管如此,当给出某些输入时,他们还是会给出 不同的行为

切中要害:有点 一个我一无所知的大项目 如何追踪执行时间 水流发散,所以。。。有办法追踪吗 函数调用树(可能不包括 std电话)以及,我不知道,线路 源文件和源文件中的编号 名称 也许是一些gcc或宏观功夫

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

尽管如此,当给出某些输入时,他们给出了不同的行为

为了更好地理解
某些输入的算法的工作,我将在新旧版本中扩展日志记录。当它变得更清晰时,例如,如果您仍然需要它,您可以使用gdb

更新

好的,对于我来说,登录是可以的,但您不想添加它。

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

你可以用

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

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

文档中甚至有一个例子:

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


你是想在控件到达某一点时打印调用堆栈(即添加代码以输出当前堆栈),还是想寻找一个外部工具来分析程序运行时的流程(基本上是callgrind的手册页)?我以前使用过callgrind,但是,如果我记得的话,它只输出函数被调用的次数和函数之间的关系(以及其他内容,但它丢弃了程序历史记录)。我很可能是错的,因为我只是通过KCachegrind使用它。我需要一些东西“简单地”输出函数名,以及在执行流程中从何处调用它们。与ltrace类似,但用于我的代码,而不是库调用。我考虑过这一点,但我不能在整个代码中到处添加日志消息。@3mpty,这些“用户空间探测”基于软件断点。您只需要使用调试信息构建程序,并提供函数名的白名单或黑名单。谢谢:)我在上用简单的东西获得了一个基本的跟踪日志,但这与其说是严重的问题,不如说是黑客行为。我将尝试systemtrap,看看是否能获得更好的结果。
stap -d /bin/ls --ldd \
-e 'probe process("ls").function("xmalloc") {print_ustack(ubacktrace())}' \
-c "ls /"