2011-02-04 42 views
0

我正在调试一个令人讨厌的问题,其中一个文件(不是我写的任何记录)会导致程序崩溃。这意味着,我有workingbroken,只有一个C(++)包含语句已更改。我使用的一些库没有调试信息。如何使用GDB输出C +程序集跟踪?

我想要做的是让GDB输出为程序运行而执行的每一行C++,以及一些不能用于文本文件的x86指令,这种格式可以区分两个输出并希望能够找出什么出错。

在GDB中这很容易吗?

回答

5

您可以检查每个版本中预处理输出之间的差异。例如:

gcc -dD -E a.cc -o a.pre 
gcc -dD -E b.cc -o b.pre 
diff -u a.pre b.pre 

您可以尝试使用不同的“-d”设置以使其更加冗长/简洁。也许在列表上的差异将是显而易见的。它通常就像一个根据包含文件改变大小的结构。

如果你真的想要弄乱每条指令或线条痕迹,你可以使用valgrind并查看路径在哪里分歧,但我认为你可能会遇到一个痛苦的世界。事实上,你可能会发现valgrind发现你的bug,然后100你不知道关于:)我期望这个问题只是一个结构或其他数据大小的差异,你不需要打扰。

你可以让gdb自动化线跟踪。这将是非常痛苦的。基本上你需要编写脚本来重复运行“n”(下一行),直到崩溃,然后检查日志。如果你可以脚本“B主”,然后“运行”,然后无限的“N”,这将做到这一点。可能有一个内置的命令来做到这一点,但我不知道它。

+0

除了`#if` /`#else`结构等变体外,还可能有一些静态初始化错误。如果存在某种依赖性,`#include`可能会改变其包含的其他内容的顺序,从而导致崩溃。或者,`#include`文件可能会添加一个初始化失败的静态对象。 `gcc -E`输出也是开始调查这些问题的好方法。如果失败的`#include`放在最后(所以其他包含的顺序没有改变),它可能会最小化差异噪声,然后查看它是否仍然中断。 – 2011-02-04 05:10:40

0

我不认为GDB可以做到这一点;虽然个人资料可能会有帮助吗?你用gcc编译?看看-p和-pf命令,我认为这些可能很有用。

0

gdb提示符下的disassemble命令将反汇编您停止的当前函数,但我不认为输出整个执行路径是可行的。

你包括哪些图书馆?如果它是开源的,你可以在启用调试符号的情况下重新编译它。另外,如果您使用的是Linux,大多数发行版都有-dbg版本的公用库。