Android _Unwind_Backtrace里面的sigaction

Sal*_*RYS 7 android signals stack-trace backtrace android-ndk

我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.

我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.

那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)

我应该指出:

  • 使用backtrace()backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供

  • 我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.

编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.

fad*_*den 3

pthread_getattr_np您可以使用和获取堆栈基地址pthread_attr_getstack,但您真正需要的是崩溃时的 PC 和 SP。在 Linux 上,您可以将它们从ucontext.

如果在配置信号处理程序时设置该SA_SIGINFO标志,则处理程序函数将获取三个参数而不是一个。第三个void*参数是一个ucontext指针。这个问题的公认答案解释得更多一些。

一旦你得到了所有的东西,你就可以展开堆栈了。如果您不介意超出 NDK 提供的范围,Android 的libcorkscrew具有可以展开堆栈并输出结果的函数。debuggerd 守护进程使用它将本机崩溃转储到日志文件中。

了解 debuggerd 记录的本机崩溃会在/data/tombstones/. 文件权限使得普通应用程序无法访问它,但在修改后的设备上,您可以将它们拉出并发送。

  • 我已经搜索过,但我无法从您的答案中弄清楚如何使用 ucontext 指针展开堆栈。你有什么例子吗? (3认同)