通常,当您通过GDB运行程序时,可以按Ctrl + C来中断它,例如如果它陷入无限循环并且你想获得回溯。
我正在调试一个程序(xmms2d,因为它发生),但只在这个程序中,当我按下Ctrl + C它被视为GDB没有运行 - 程序干净地关闭然后GDB告诉我程序已退出通常
如何恢复常见的GDB行为,Ctrl + C会中断程序?或者还有另一种方法可以在GDB中产生与Ctrl + C通常相同的反应吗?
答案 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
的情况下运行它。