我正在调试一个令人讨厌的问题,其中#include
一个文件(不是我写的任何东西,用于记录)导致程序崩溃。这意味着,我有working
和broken
,只更改了一个C(++)include语句。我正在使用的一些库没有调试信息。
我想要做的是让GDB输出为程序运行执行的每一行C ++,以及x86指令,这些文本文件不可用,这种格式我可以将两个输出区分开,并希望弄清楚是什么错。
这在GDB中很容易实现吗?
答案 0 :(得分: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 main”,那么“运行”,然后无限“n”即可。可能有一个内置的命令来做,但我不知道它。
答案 1 :(得分:0)
我不认为GDB可以做到这一点;也许个人资料会有所帮助吗?你在用gcc编译吗?查看-p和-pf命令,我认为这些命令可能很有用。
答案 2 :(得分:0)
gdb提示符下的disassemble
命令将反汇编您停止的当前函数,但我不认为输出整个执行路径是可行的。
你包括哪些图书馆?如果它是开源的,您可以在启用调试符号的情况下重新编译它。此外,如果您使用的是Linux,则大多数发行版都有-dbg
个版本的公共库包。