2013-03-27 60 views
3

我正試圖捕獲GDB中的浮點異常(SIGFPE),而不是將它傳遞給進程並繼續調試。 我給GDB這樣的:當一個SIGFPE發生GDB停止在正確的位置GDB:捕獲信號並繼續調試

handle SIGFPE stop nopass 

。問題是我不能也不知道如何繼續調試。 我試圖讓GDB

continue 

signal 0 

,但它仍然掛在違規線,並拒絕繼續。

有沒有辦法在接收到信號後繼續調試?

我使用的是GDB 7.5.1,這是我自己編譯的,我也嘗試過使用我的12.04 Ubuntu發行版的GDB 7.4。兩者都有相同的行爲。

回答

6

的問題是,當你同步信號後繼續執行程序,它重新執行引起的信號,這意味着你會再次得到信號相同的指令。如果您告訴它忽略該信號(直接或通過gdb),它將進入一個緊密的循環,重複執行該指令。

如果您想在導致信號的指令之後的某個地方實際上繼續執行程序,則需要在發出continue命令之前手動將$pc寄存器設置爲下一個(或其他)指令。

+0

謝謝你的洞察力。採取你所說的話,我試圖讓GDB在處理接收到的信號後繼續「處理SIGFPE nostop nopass」,然後試圖繼續,因此它在我恢復後第二次忽略信號。但是GDB接縫在此之後就會掛起,它甚至不能再次停頓。這將是非常簡單的解決方案,現在我必須手動移動程序計數器。 – Sogartar 2013-03-27 17:28:29

+0

那麼這意味着沒有辦法以完全相同的方式執行程序而不跳過指令? – Sogartar 2013-03-27 17:38:01

+0

@Sogartar你確實以完全相同的方式執行......並得到完全相同的結果。 – Ruslan 2017-06-29 11:32:52