【问题标题】:Debugging a segmentation fault when I do ctrl c当我执行 ctrl c 时调试分段错误
【发布时间】:2009-02-16 17:48:27
【问题描述】:

取消程序时出现分段错误。我正在使用 gdb 进行调试,问题是当我在调试时按 Ctrl-C 时,gdb 并没有取消程序,而是执行它应该做的事情就是停止它。

我想要的是执行 Ctrl-C 并且不允许 gdb 停止它。有没有办法做到这一点?还有其他调试建议吗?我不能使用 printf,因为我真的不清楚问题出在哪里。

【问题讨论】:

    标签: debugging gdb copy-paste


    【解决方案1】:

    gdb 正在拦截信号。当您按下 CTRL-C 时,实际上是在使终端驱动程序生成一个 SIGINT。

    您需要做的是让 GDB 使用 signal 命令生成 SIGINT。语法是

    信号编号

    man signal 会告诉你信号编号(在这种情况下,SIGINT 是信号 2,所以signal 2 会这样做。)

    更新

    果然可以使用符号名。 info signal 会告诉你所有的名字等等。

    哦,顺便说一句,很可能您为 SIGINT 安装了信号处理程序,但参数不正确。

    【讨论】:

    • 您还可以为信号使用符号名称,例如“signal SIGINT”。
    • 这对我来说有点不明显 - 我们需要进入 gdb 提示符(例如通过 ctrl+c 本身),然后 signal SIGINT 将恢复并向程序发送信号。
    【解决方案2】:

    另一种方法是在运行程序之前通过在 gdb 提示符处键入 handle SIGINT noprint pass 来阻止 gdb 捕获 SIGINT。

    【讨论】:

    • 嗯,是的,但有时能够中断 gdb 很方便。
    • 这应该是公认的答案,因为它影响程序时间和行为最少,而且它实际上回答了操作的问题。
    【解决方案3】:

    一种选择是将不在调试器中运行时生成的核心文件加载到 gdb 中。在 gdb 中,输入 core-file [filename]

    【讨论】:

      【解决方案4】:

      你也可以从另一个终端发送 CTRL-C(又名 SIGINT):kill -INT

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        相关资源
        最近更新 更多