GDB:Ctrl + C不像通常那样中断进程,而是终止程序

时间:2011-05-02 12:48:39

标签: gdb signals

通常,当您通过GDB运行程序时,可以按Ctrl + C来中断它,例如如果它陷入无限循环并且你想获得回溯。

我正在调试一个程序(xmms2d,因为它发生),但只在这个程序中,当我按下Ctrl + C它被视为GDB没有运行 - 程序干净地关闭然后GDB告诉我程序已退出通常

如何恢复常见的GDB行为,Ctrl + C会中断程序?或者还有另一种方法可以在GDB中产生与Ctrl + C通常相同的反应吗?

5 个答案:

答案 0 :(得分:24)

我敢打赌xmms2d正在使用sigwait()来处理信号,这会破坏gdb捕获CTRL-C的能力。见https://bugzilla.kernel.org/show_bug.cgi?id=9039

我通过阅读Continue to debug after failed assertion on Linux?得到了一个解决方法的想法 - 当我准备好在gdb中打破时,我运行“kill -TRAP< pid>”从另一个终端窗口。

答案 1 :(得分:6)

在gdb提示符下,您可以执行“处理SIGINT停止”,以便gdb捕获CTRL-C

答案 2 :(得分:4)

我遇到了干扰gdb的SDL信号处理程序引起的同样问题。 我发现在启动gdb时解决此问题的一种解决方案:

start
call sigignore(2)
continue

现在应用程序将忽略所有CTRL-C。

如果您attach进行了一些处理并希望在调配后将其恢复到原始状态,则可以执行以下操作:

set $oldcallback = signal(2, 0)
call sigignore(2)
continue

当你完成时:

call signal(2, $oldcallback)
detach

答案 3 :(得分:0)

您可以使用以下命令更改GDB的输入/输出目标:

gdb -tty = /dev/tty1

答案 4 :(得分:0)

请注意,在rlwrap下运行GDB会破坏其正确拦截^C的能力。如果要这样做,请尝试在不使用rlwrap的情况下运行它。