我正在重写 C++ 命令行程序中的一些代码。
我更改了它使用的低级数据结构,新版本毫无问题地通过了所有测试(很多),并且我从新版本和旧版本中都得到了正确的输出......不过,当给出某些输入时,他们给出不同的行为。
切入正题:作为一个大项目,我不知道如何追踪执行流程何时出现分歧,所以......有没有办法追踪函数调用树(可能不包括std调用)以及,我不知道,源文件中的行号和源名称?也许一些 gcc 或宏功夫?
我需要一个 Linux 解决方案,因为这是程序运行的地方。
尽管如此,当给出某些输入时,它们会给出不同的行为
为了更好地了解您的算法在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 /"