2011-05-02 143 views
25

通常,当你通过GDB运行一个程序时,你可以按Ctrl + C来中断它,如果它陷入无限循环,并且想要回溯。GDB:Ctrl + C不象通常那样中断进程,而是终止程序

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

如何获得通常的GDB行为,Ctrl + C中断程序?或者还有另外一种方法可以像Ctrl + C一样在GDB中产生相同的反应?

+0

什么是你的GDB版本和操作系统?你可以在哪里发生一个最小的C程序? – 2015-10-28 16:31:52

+0

每年有1000多人来这里寻找答案:-)新的问题可以作为这一个的重复被关闭。但是如果你忘记了细节,我不会责怪你。 – 2015-10-29 05:43:15

回答

22

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

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

+0

完美的作品,谢谢你的回答! – Malvineous 2011-08-04 00:52:19

+0

不幸的是,当底层进程挂起时,我无法像这样解除阻塞gdb。 gdb和我的进程仍然挂起:-(任何其他提示? – lethalman 2014-01-17 14:18:17

0

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

gdb -tty = /dev/tty1 
+0

这不能解决问题。输出确实去到另一个终端,但是当你在gdb的终端上按Ctrl + C时,被调试的程序仍然捕获信号并且干净地退出,就好像你根本没有改变tty一样。 – Malvineous 2014-06-29 01:30:28

5

在gdb提示,你可以做“处理SIGINT停止”,使GDB捕获CTRL-C

+0

这个对我来说很好,谢谢 – 2015-06-09 11:07:34

+0

这个解决方案对我有用! – 2016-08-22 17:59:43

3

我有同样的由干扰gdb的SDL信号处理程序引起的问题。 一个解决方案,我觉得开始时,广发行对解决此:

start 
call sigignore(2) 
continue 

现在所有CTRL-C将通过申请被忽略。

如果attach一些过程,想调试运行后,它恢复到原来的状态,你可以这样做:

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

当你完成:

call signal(2, $oldcallback) 
detach