【问题标题】:GDB doesn't return after segmentation fault分段错误后 GDB 不返回
【发布时间】:2011-01-16 22:32:12
【问题描述】:

我有一些代码,我目前正在从 OS X 移植到 Linux(控制台工具)。

在这段代码的某个地方,我遇到了分段错误。问题是,如果我在没有 GDB 的情况下运行程序,我清楚地看到了分段错误,程序被杀死了。但是当我运行 GDB 时它会停止,并且 GDB 永远不会返回到提示符。所以我真的无法检查发生了什么。

C++ 是代码。使用 g++ 中的 -g 选项编译。

顺便说一句。对 GDB 来说很新,如果这很明显,请原谅。

有什么想法吗? 提前致谢。

特伦斯科

【问题讨论】:

  • 如果在它“挂起”时按 Ctrl-C 会发生什么?这应该将控制权交还给 GDB。
  • 很抱歉,这似乎是一个愚蠢的建议,但您是否真的退出了 gdb(通常使用 'quit')?它会暂停,以便您可以在实际发生分段错误时检查堆栈的状态,以找出导致它的原因。
  • 您可以尝试在 valgrind 下运行您的程序——它通常会在 gdb 注意到错误之前发现错误(当然,以运行程序比正常速度慢 10 倍为代价)
  • CTRL+C 不做任何事情。它只是在分段错误之后挂起。没有 GDB 提示,没有 bash 提示。没什么。摆脱它的唯一方法是打开另一个控制台窗口,然后杀死 gdb,这让我回到 bash。

标签: c++ c debugging gdb segmentation-fault


【解决方案1】:

gdb 将在收到 seg 故障信号时暂停您的程序

键入 where 以查看堆栈跟踪并开始检查那里发生的情况。

还可以考虑启用核心转储,这样您就可以在 GDB 中加载核心转储并调查发生了什么

然后你可以像这样加载核心转储

> gdb your_program the_core_dump

【讨论】:

    【解决方案2】:

    您描述的行为不典型 - 我怀疑堆栈可能已被丢弃。

    尝试通过“kill”命令直接发送各种信号。

    可能值得你在 gdb 中运行一个带有 abort() 的测试程序,这样你就可以了解 gdb 的预期行为。

    【讨论】:

      【解决方案3】:

      我以前在我的堆栈太大时看到过这种情况。尝试将堆栈变量移到堆上(使它们成为全局变量),重新编译,看看是否仍然出现错误。

      【讨论】:

        猜你喜欢
        • 2011-06-16
        • 2021-12-23
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        • 2016-01-12
        相关资源
        最近更新 更多