2013-10-31 63 views
0

我正在使用mprotect將一些內存頁面設置爲寫保護。當在該存儲器區域嘗試任何寫入時,程序將獲取SIGSEGV信號。從信號處理程序我知道在哪個內存地址嘗試寫入,但我不知道如何找出哪條指令導致寫保護違規。所以在信號處理程序中,我正在考慮讀取程序計數器(PC)寄存器以獲取錯誤的指令。有沒有簡單的方法來做到這一點?mprotect:如何獲得導致保護違規的指令?

回答

3

如果使用sigactionSA_SIGINFO標誌安裝信號處理程序,第三個參數的信號處理程序的類型爲void *不過分ucontext_t類型的結構,又包含mcontext_t型的結構。 mcontext_t的內容是實現定義的,並且通常是特定於cpu架構的,但這是您可以找到保存的程序計數器的位置。

編譯器的內置函數(__builtin_return_address帶有非零參數,我認爲)和展開表也可以跟蹤整個信號處理程序。雖然這在某些方面更爲普遍(它不是特別針對cpu-arch),但我認爲它更脆弱,它是否真正起作用可能是cpu-arch和ABI特有的。

相關問題