0
我正在使用mprotect將一些內存頁面設置爲寫保護。當在該存儲器區域嘗試任何寫入時,程序將獲取SIGSEGV信號。從信號處理程序我知道在哪個內存地址嘗試寫入,但我不知道如何找出哪條指令導致寫保護違規。所以在信號處理程序中,我正在考慮讀取程序計數器(PC)寄存器以獲取錯誤的指令。有沒有簡單的方法來做到這一點?mprotect:如何獲得導致保護違規的指令?
我正在使用mprotect將一些內存頁面設置爲寫保護。當在該存儲器區域嘗試任何寫入時,程序將獲取SIGSEGV信號。從信號處理程序我知道在哪個內存地址嘗試寫入,但我不知道如何找出哪條指令導致寫保護違規。所以在信號處理程序中,我正在考慮讀取程序計數器(PC)寄存器以獲取錯誤的指令。有沒有簡單的方法來做到這一點?mprotect:如何獲得導致保護違規的指令?
如果使用sigaction
與SA_SIGINFO
標誌安裝信號處理程序,第三個參數的信號處理程序的類型爲void *
不過分ucontext_t
類型的結構,又包含mcontext_t
型的結構。 mcontext_t
的內容是實現定義的,並且通常是特定於cpu架構的,但這是您可以找到保存的程序計數器的位置。
編譯器的內置函數(__builtin_return_address
帶有非零參數,我認爲)和展開表也可以跟蹤整個信號處理程序。雖然這在某些方面更爲普遍(它不是特別針對cpu-arch),但我認爲它更脆弱,它是否真正起作用可能是cpu-arch和ABI特有的。