我想在我的Android NDK應用程序中捕獲SIGSEGV等信號以進行調試。爲此,我建立了一個被稱爲的sigaction。Android _Unwind_Backtrace裏面的sigaction
我現在正試圖獲得該通話的堆棧。問題是_Unwind_Backtrace
只適用於當前堆棧,sigaction在它自己的堆棧中運行。
那麼,有沒有辦法讓接收到信號的執行指針堆棧? (基本上告訴_Unwind_Backtrace
放鬆另一個堆比目前?)
我要指出的是:
使用
backtrace()
和backtrace_symbols()
是不是因爲這些功能都沒有在Android NDK 交付選項
我正在使用GDB調查本地設備上的崩潰。我不想替換GDB,當我給他發送測試版本時,我希望能夠從客戶端接收到有意義的堆棧跟蹤。
編輯: 使用Android的libcorkscrew從系統/核心所建議的法登,但是當我使用它的unwind_backtrace_signal_arch功能,我得到一個奇怪的回溯不代表死機我都試過了。
我已經搜索,但我無法從你的答案中找出如何用ucontext指針展開堆棧。你有沒有例子? –
ucontext.h不是在仿生中提供的,這是android使用的。我也非常感興趣的是如何在結構不存在的平臺上從這個結構中提取信息。我是否應該相信它與Linux中的成員順序相同,只需通過內存地址提取PC和SP? – codetaku
ucontext。h是仿生學的一部分,但它可能不能從NDK獲得(參見https://android.googlesource.com/platform/bionic/+/kitkat-release/libc/kernel/arch-arm/asm/ucontext.h )。並不是說它做得很好 - 它有一個相當通用的定義。 AFAIK沒有針對ucontext的特定於Android的定製。 – fadden