2011-05-02 146 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