通常情况下,当您通过GDB运行程序时,您可以按Ctrl+C来中断它,例如,如果它陷入无限循环,您需要获取一个回溯。
我正在调试一个程序(恰好是xmms2d),但在这个程序中,当我按Ctrl+C时,它会被视为未运行GDB - 程序会干净地关闭,然后GDB告诉我程序正常退出。
如何恢复通常的GDB行为,使得Ctrl+C可以中断程序?还是有其他方法可以在GDB中产生与Ctrl+C相同的反应?
通常情况下,当您通过GDB运行程序时,您可以按Ctrl+C来中断它,例如,如果它陷入无限循环,您需要获取一个回溯。
我正在调试一个程序(恰好是xmms2d),但在这个程序中,当我按Ctrl+C时,它会被视为未运行GDB - 程序会干净地关闭,然后GDB告诉我程序正常退出。
如何恢复通常的GDB行为,使得Ctrl+C可以中断程序?还是有其他方法可以在GDB中产生与Ctrl+C相同的反应?
我敢打赌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>"。
handle SIGINT pass
是Google让我来这里解决(相反的)问题的解决方案。 - Martin Doreystart
call sigignore(2)
continue
set $oldcallback = signal(2, 0)
call sigignore(2)
continue
完成后:
call signal(2, $oldcallback)
detach
gdb
脚本,文件名为sighandler.gdb
。该脚本文件位于项目目录中:gdb_sigwait/src/sighandler.gdb
然后,在编译器初始化文件(~/.gdbinit
)中source
上述脚本文件,例如:
source ~/gdb_sigwait/src/sighandler.gdb
gdb
脚本太长了。
因此,我创建了一个github项目来介绍和存储相关代码:
https://github.com/fairyfar/gdb_sigwait
rlwrap
下运行GDB会破坏其正确拦截^C
的能力。如果您正在这样做,请尝试在没有rlwrap
的情况下运行它。gdb
使用readline
,那么为什么还要使用rlwrap
呢? - Hans Lubrlwrap
。很抱歉目前我没有时间来生成一个错误报告。 - Radon Rosboroughgdb -tty = /dev/tty1