【问题标题】:GDB (DDD), debugging questionsGDB(DDD),调试问题
【发布时间】:2010-07-23 04:45:01
【问题描述】:

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

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

任何解释都非常感谢,

彼得

【问题讨论】:

  • “HEAP ERROR”崩溃是什么意思?分段错误?

标签: c++ gdb ddd-debugger


【解决方案1】:

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

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

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

【讨论】:

  • 调试时,我当然不使用任何优化标志,即使我没有明确禁止使用 -O0 进行优化。
【解决方案2】:

几个可能的解释:

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

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

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

断点通常放在语句上,因此请注意这一点。这里的问题也可能是由二进制文件和您使用的代码不匹配引起的。

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

再次,参见#2。

【讨论】:

    【解决方案3】:

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

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

    使用g++ 使用-O0 或根本不使用-O 来关闭优化。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        1. 堆检查可能在main 返回后完成,在 GDB 中尝试set backtrace past-main。如果它崩溃了——进程消失了——你需要将核心文件加载到调试器中(gdb prog core)。
        2. 优化代码,见@dmckee 的回答
        3. 同 2。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-05
          • 2023-04-05
          • 2013-11-20
          • 1970-01-01
          • 2017-10-10
          • 1970-01-01
          • 2020-12-18
          相关资源
          最近更新 更多