gpt4 book ai didi

sigaction 中的 Android _Unwind_Backtrace

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:16 24 4
gpt4 key购买 nike

我正尝试在我的 Android NDK 应用程序中捕获信号,例如 SIGSEGV 以进行调试。为此,我设置了一个名为的 sigaction。

我现在正在尝试获取调用的堆栈。问题是 _Unwind_Backtrace 仅适用于当前堆栈,而 sigaction 在其自己的堆栈中运行。

那么,有没有办法得到接收到信号的执行指针的栈呢? (基本上告诉 _Unwind_Backtrace 展开当前堆栈之外的另一个堆栈?)

我应该指出:

  • 使用 backtrace()backtrace_symbols() 不是一种选择,因为这些函数未在 Android NDK 中提供

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

编辑:我尝试按照 fadden 的建议使用 system/core 中的 Android libcorkscrew,但是当我使用它的 unwind_backtrace_signal_arch 函数时,我得到了一个不代表崩溃的奇怪回溯。

最佳答案

你可以用pthread_getattr_nppthread_attr_getstack得到栈基地址,但你真正需要的是崩溃时的PC和SP。在 Linux 上,您可以将它们从 ucontext 中提取出来。

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

一旦您掌握了所有内容,您就可以展开堆栈。如果您不介意超出 NDK 提供的范围,Android 的 libcorkscrew 具有可以展开堆栈并输出结果的函数。 debuggerd 守护程序使用它来将 native 崩溃转储到日志文件。

了解由 debuggerd 记录的 native 崩溃在 /data/tombstones/ 中生成堆栈转储可能很有用。文件权限使普通应用程序无法访问它,但在经过修改的设备上,您可以将它们取出并发送。

关于sigaction 中的 Android _Unwind_Backtrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18017222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com