GDB中的一些东西(实际上使用DDD gui)在调试我自己的C ++代码时会让我感到困惑:
1)为什么HEAP ERROR崩溃后没有可用的回溯? 2)为什么gdb有时会在断点之后而不是在断点处停止? 3)有时单步执行注释行会导致执行某些指令(gdb忙)??
非常感谢任何解释,
彼得
答案 0 :(得分:1)
1)我不确定堆错误,但是例如,如果内存不足,它可能无法正确处理回溯。此外,如果堆损坏导致指针炸毁应用程序堆栈的一部分,导致回溯不可用。
2)如果您启用了优化,则很可能会发生这种情况。编译器可以重新排序语句,并且放置断点的基础程序集可以对应于后面的代码行。在尝试调试此类事物时不要使用优化。
3)这可能是由于源代码未在执行前重建(因此二进制文件与实际源不同,或者甚至可能再次来自优化设置。
答案 1 :(得分:1)
几乎没有解释:
1)为什么HEAP ERROR崩溃后没有可用的回溯?
如果程序正在生成核心转储文件,您可以按如下方式运行GDB:“gdb program -c corefile”并获得回溯。
2)为什么gdb有时会在断点之后而不是在断点处停止?
断点通常放在陈述上,因此请注意。这里的问题也可能是由二进制文件和您正在使用的代码之间的不匹配引起的。
3)有时单步执行注释行会导致执行某些指令(gdb忙)??
再次,请参阅#2。
答案 2 :(得分:0)
2)为什么gdb有时会在断点之后停止而不是在断点处停止?
您在编译期间是否启用了优化?如果是这样,编译器可能正在对您的代码进行非平凡的重新排列...这也可以设想解决您的数字3。
g++
使用-O0
或根本不使用-O
来关闭优化。
我不清楚你的1号在问什么。
答案 3 :(得分:0)
关于断点和注释/指令行为,您是否在启用优化的情况下进行编译(例如,-O3
等)? GDB可以处理这种情况,但是在调试优化代码时有时会出现您所看到的行为,尤其是使用积极优化编译的代码时。
答案 4 :(得分:0)
main
返回后完成,在GDB中尝试set backtrace past-main
。如果它崩溃 - 过程消失了 - 你需要将核心文件加载到调试器(gdb prog core
)。