2010-07-22 202 views
0

在GDB有些东西(实际使用DDD GUI)让我困惑,调试自己的C++代码时:GDB(DDD),调试问题

1)为什么会出现一堆错误崩溃后没有可用的回溯? 2)为什么gdb有时在断点之后而不是在断点处停止? 3)有时通过注释行来执行某些指令会导致执行(gdb busy)?

大为赞赏任何解释,

切赫

+0

什么用 “堆ERROR” 的意思是崩溃?分段错误? – Void 2010-07-22 20:36:46

+0

是的,一个段错误。 – PetrH 2010-07-23 17:20:48

回答

0

2)为什么GDB有时停止后的断点,而不是在断点处?

您在编译过程中是否启用了优化?如果是这样的话,编译器可能会对你的代码进行不重要的重新排列......这也可以设想你的编号为3。

随着g++使用-O0或没有-O在所有关闭优化。

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

0

关于断点和注释/指令行为,您是否在编译时启用了优化(例如,-O3等)? GDB可以处理这个问题,但是当你调试优化过的代码时,你看到的行为有时会发生,特别是使用积极优化编译的代码。

1

1)我不确定堆错误,但例如,如果内存不足,可能无法正确处理回溯。另外,如果堆损坏导致指向的部分应用程序的堆栈会导致回溯不可用。

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

3)这可以通过或者不具有执行之前被重建(源代码,以便将二进制是甚至再次优化设置与实际源不同,或可能引起

+0

调试时,我当然不会使用任何优化标志,即使我没有特别禁止使用-O0进行优化。 – PetrH 2010-07-23 17:22:18

1

几个可能的解释相关:

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

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

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

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

3)有时通过注释行逐步导致执行一些指令(gdb busy)??

再次参见#2。

0
  1. 堆检查可能完成后main回报,尝试在GDB set backtrace past-main。如果崩溃了 - 进程已经结束 - 您需要将核心文件加载到调试器中(gdb prog core)。
  2. 优化的代码,看到@ dmckee的答案
  3. 同2.