2011-07-25 64 views
3

儘管信號處理程序爲SIGSEGV,但我仍遇到分段錯誤。首次將數據寫入受保護的存儲器時,我可以看到信號處理程序被調用,但在信號處理程序退出之前,會出現分段錯誤。存在信號處理程序時出現分段錯誤

什麼可能導致它?我的SIGSEGV處理程序是否應該捕獲所有的分段錯誤?

+0

你希望通過處理一個'SEGV'信號來完成什麼? –

回答

4

我可以看到,如果分段錯誤與堆棧指針訪問內存不兼容,那麼操作系統不允許使用當前堆棧指針進行任何調用。包括呼叫信號處理程序。換句話說,爲您的信號處理函數編譯器創建的序言必須在堆棧上設置一個激活記錄......如果堆棧指針本身無效,那麼這是不可能的。一種可能發生的方式是溢出一個內存數組,然後寫入當前正在執行的函數的激活記錄。

您可以通過sigaltstack()定義另一個存儲器區域作爲信號處理器的堆棧,然後在sigaction()中爲信號設置SA_ONSTACK選項。這可能是你可能想要嘗試的。

最後,如果您使用非異步安全函數或以某種方式訪問​​由信號處理程序中的操作系統分配給您的進程的內存段之外的指針或內存,也可能遇到問題。

2

如果您的信號處理程序反過來激起另一個信號,當然不會被您的信號處理程序捕獲,因爲您會有一種無限循環。