我已閱讀(see here)認爲,「普遍做法」到故障信號處理過程中打印使用backtrace()堆棧跟蹤(如處理SIGSEGV
時),在Linux下是:回溯()故障(SIGSEGV)信號處理過程中的功能
1從未公開的sigcontext
結構中獲取指令指針(EIP
或RIP
)。
2更換與指令指針棧跟蹤中的第二幀中,由於第一幀是信號處理程序,並且第二幀被認爲是內libc
在sigaction
代碼,這已重寫的原始幀,其中發生故障。
3從新替換的第二幀開始打印回溯。
在我看來,在我的測試(上x86_64
2.6內核),其實在發生故障的原始幀存在於第三幀由backtrace()
給出的堆棧跟蹤 - 首先是信號處理程序和第二個是libc
信號處理代碼。
內核信號處理的這種變化是否記錄在某處,您可以參考我?
在我看來,結果是你可以避免從指令指針中取代任何幀,只需從第3幀開始輸出backtrace()
的堆棧跟蹤,但我想確認這是已知的行爲和正確的方法去做吧。