0

在调试我自己的 C++ 代码时,GDB 中的一些东西(实际上是使用 DDD gui)让我感到困惑:

1) 为什么在 HEAP ERROR 崩溃后没有可用的回溯?2)为什么gdb有时会在断点之后而不是在断点处停止?3) 有时单步执行注释行会导致执行某些指令(gdb 忙)??

任何解释都非常感谢,

彼得

4

5 回答 5

1

1) 我不确定是否存在堆错误,但例如,如果内存不足,它可能无法正确处理回溯。此外,如果堆损坏导致指针炸毁应用程序堆栈的一部分,这将导致回溯不可用。

2)如果您启用了优化,则很有可能发生这种情况。编译器可以重新排序语句,并且放置断点的底层程序集可能对应于后面的代码行。尝试调试此类事情时不要使用优化。

3)这可能是由于源代码在执行之前没有被重建(因此二进制文件与实际源代码不同,或者甚至可能再次来自优化设置。

于 2010-07-22T20:43:22.103 回答
1

几个可能的解释:

1) 为什么在 HEAP ERROR 崩溃后没有可用的回溯?

如果程序正在生成核心转储文件,您可以按如下方式运行 GDB:“gdb program -c corefile”并获得回溯。

2)为什么gdb有时会在断点之后而不是在断点处停止?

断点通常放在语句上,所以要小心。这里的问题也可能是由二进制文件和您使用的代码不匹配引起的。

3) 有时单步执行注释行会导致执行某些指令(gdb 忙)??

再次,参见#2。

于 2010-07-22T20:43:52.597 回答
0
  1. 堆检查可能在返回后完成,请在 GDB 中main尝试。set backtrace past-main如果它崩溃了——进程消失了——你需要将核心文件加载到调试器(gdb prog core)中。
  2. 优化代码,见@dmckee 的回答
  3. 同2。
于 2010-07-22T20:45:01.077 回答
0

2)为什么gdb有时会在断点之后而不是在断点处停止?

您在编译期间是否启用了优化?如果是这样,编译器可能正在对您的代码进行重要的重新排列......这也可以解决您的数字 3 问题。

使用或不g++使用以关闭优化。-O0-O

我不清楚你的 1 号在问什么。

于 2010-07-22T20:40:59.077 回答
0

关于断点和注释/指令行为,您是否在启用优化的情况下进行编译(例如-O3,等)?GDB 可以处理这种情况,但您看到的行为有时会在调试优化代码时发生,尤其是在使用积极优化编译的代码时。

于 2010-07-22T20:41:28.590 回答