- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正尝试在我的 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_np
和pthread_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/
我在一些代码中看到以下用法: struct sigaction term_handler; // global variable without initialization ... sigacti
我正在做简单的 sigaction 示例来练习 C,但是当我尝试编译代码时,它声称 struct sigaction 不存在 [1]。 当我检查我生成的一些旧代码时,我发现我在文件的最顶部添加了一些
如果我们使用 sigaction 来定义一个信号处理程序,那为什么我们不需要重置处理程序呢?如果我们使用 signal(sig_no,handler_func)那么我们必须重置它。为什么是这样? #i
我正在学习信号并编写了一个简单的程序来处理它们。 所以我输入一个数字,然后使用 fork 创建一个进程。父进程应该将数字作为信号发送给子进程,然后 child_signal 处理程序应该将数字的平方作
我在 C++ 中对此类使用 sigaction 时遇到问题: class SerialHandler{ private: ... /* Action Handling
我有以下 sigaction 处理程序代码 void signal_term_handler(int sig) { int rc = async_lockf(pid_file, F_UNLCK
我正在使用 sigaction 作为信号,我正在为此使用一个简单的结构。我实际上是从手册页中获取的。有人可以向我解释结构中的第二行是做什么的吗?还有一个错误: error: expected decl
有没有办法用sigaction结构和函数只捕获一次信号?更具体地说,我想简单地重置为默认特定信号 (SIGINT)。是否有可能在处理程序中实现这一点? 编辑 所以,这样的事情是正确的: void si
我正在将程序的信号处理从 signal() 转换为 sigaction()。 根据UNIX spec struct sigaction 应该至少有 4 个成员; sa_handler、sa_mask、
我很难理解 sigaction() 的方式有效。 在 , sigaction 定义为 int sigaction(int sig, const struct sigaction *act, struc
我正在查看 sigaction 的手册页,最后我看到了以下行。 sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
在我下面的代码中,如果我将 old_act 声明为全局变量,那么程序可以正常工作。如果在 main 中声明: 如果使用 SA_RESTART,它工作正常 如果不使用 SA_RESTART,则会导致段错
我必须向进程发送两个信号,SIGUSR1 和 SIGUSR2,以便修改程序中的特定 bool 变量 (SIGUSR1 将其设置为 true,SIGUSR2 将其设置为 false)。所以我写了一个 s
我正要向我们这里的应用程序添加一个额外的信号处理程序,我注意到作者使用了 sigaction() 来设置其他信号处理程序。我打算使用 signal()。按照惯例,我应该使用 sigaction(),但
编译以下代码, struct sigaction sa; memset (&sa, 0, sizeof (sa)); sa.sa_handler = &handler; sigaction (SIGR
我有一个程序,它为 SIGSEGV 安装信号处理程序。在信号处理程序中(我 try catch 崩溃)我重新启动我的应用程序。 但是当我的应用程序复活时,它不再处理 SIGSEGV。 这是一个例子:
我注意到 sigaction 被定义为结构和函数(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html):
每次收到 SIGINT 时,我都使用 sigaction() 执行操作。我见过的所有教程都使用这个原型(prototype)作为信号处理程序 void sig_handler(int sig); 有没
这个问题在这里已经有了答案: What is it with printf() sending output to buffer? (3 个答案) 关闭 3 年前。 我是 Unix 中信号的新手,这
我正在尝试以下信号处理程序,引用在线教程,但它似乎不起作用,我的代码有什么问题: #include #include #include #include #include typedef void (
我是一名优秀的程序员,十分优秀!