2012-04-28 27 views
3

我在運行程序時出現illegal operand錯誤。發生崩潰的程序是用程序集編寫的,並作爲目標文件鏈接,因此我不確定如何使用gdb。我通過捕獲SIGILL信號注意到了這個錯誤。我想獲取有問題的指令的地址。我想到的一種方法是獲取信號處理程序中的最後一個執行上下文,並記下來自其的rip寄存器的值。我知道上下文傳遞給信號處理程序,但不知道如何。如何在信號處理程序中獲得執行上下文?

+0

當然,在調試器(例如GDB)下運行你的程序比試圖捕獲它自己的異常更簡單嗎? – duskwuff 2012-04-28 17:24:47

+0

程序正在彙編! – MetallicPriest 2012-04-28 17:30:24

+0

而且? GDB不關心。 – duskwuff 2012-04-28 17:31:16

回答

4

如果您確實想要遵循信號處理程序路由,則不難獲取導致信號處理程序運行的指令地址。當您創建信號處理程序時,在標誌設置中設置SA_SIGINFO位。然後,當您編寫處理程序時,它將有權訪問siginfo_t結構,其中包括字段si_addr,該字段是觸發異常的內存位置的地址。

0

用匯編和鏈接的目標文件,所以我不知道如何使用GDB與它

GDB爲調試彙編代碼完全正常。你需要info registers,x/i $pc

我想到的一個方法是獲取信號處理程序中的最後一個執行上下文,並從中記下rip寄存器的值。

沒關係(請參閱Gabriel關於如何獲取上下文的回答)。

請注意,這將而不是給你任何額外的信息相比,你在碰撞點你得到的內部GDB。如果您不知道如何首先使用GDB,那麼通過獲取信號處理程序中的上下文,我不會看到您將獲得什麼。

相關問題