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