Native Crash回溯栈

2024-01-09 19:48:29

获取调用栈四种方案:Android Native Crash 收集

1、使用系统的<unwind.h>

可以获取到出错文件与函数名。只不过需要自己解析函数符号,同时经常会捕获到系统错误,需要手动过滤。

2、libcorkscrew

在4.1.1以上,5.0以下,使用系统自带的libcorkscrew.so,5.0开始,系统中没有了libcorkscrew.so,可以自己编译系统源码中的libunwind。libunwind是一个开源库,事实上高版本的安卓源码中就使用了他的优化版替换libcorkscrew。

3、Google Breakpad

Google 用 C++ 编写的一个开源、跨平台的崩溃报告系统,它支持 Windows、Linux?和 macOS,并提供了一个上传器,可以在进程崩溃时向一个配置好的 URL 提交 minidump 文件。

代码体量较大,在使用的时候得把无关的平台剥离掉减小体积

Breakpad(跨平台crash工具):??Breakpad(跨平台crash工具)-CSDN博客

Google Breakpad:基本介绍和操作方法 :?Google Breakpad:基本介绍和操作方法_breakpad使用-CSDN博客

4、coffeecatch

  • 优点:实现简洁、改动容易
  • 缺点:有兼容性问题

5、xcrash

xCrash源码解析:xCrash详解与源码分析

6、其他

Unwind 栈回溯详解:https://pwl999.blog.csdn.net/article/details/107569603

libunwind官网:Downloading libunwind

Android debuggerd 源码分析Android debuggerd 源码分析-CSDN博客

ARM栈回溯:https://bbs.kanxue.com/thread-261585.htm

boost.stacktrace第36章.Boost.Stacktrace 1.0 - 1.74.0

boost.stacktrace实现原理?:https://linuxcpp.0voice.com/?id=103887

C++?backtrace思路?:C++的backtrace-腾讯云开发者社区-腾讯云

微信团队栈回溯方案:性能较好的 Android native unwind 技术

C语言调用栈基础:https://www.cnblogs.com/clover-toeic/p/3949896.html

linux c崩溃感知思路:?Android平台Native崩溃捕获机制及实现

tombstones日志分析:NDK开发Crash分析

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tombstone日志文件分析

Native开发基础:Android NDK开发完全剖析

Linux内存管理:从进入内核态看内存管理 - 知乎

Android NDK获取回溯:Android NDK:获取回溯 _大数据知识库

Linux栈回溯:backtrace_symbols的栈回溯?

? ? ? ? ? ? ? ? ? ? ? ?backtrace获取

? ? ? ? ? ? ? ? ? ? ? ?栈回溯backtrace

信号

#define SIGHUP 1  // 终端连接结束时发出(不管正常或非正常)
#define SIGINT 2  // 程序终止(例如Ctrl-C)
#define SIGQUIT 3 // 程序退出(Ctrl-\)
#define SIGILL 4 // 执行了非法指令,或者试图执行数据段,堆栈溢出
#define SIGTRAP 5 // 断点时产生,由debugger使用
#define SIGABRT 6 // 调用abort函数生成的信号,表示程序异常
#define SIGIOT 6 // 同上,更全,IO异常也会发出
#define SIGBUS 7 // 非法地址,包括内存地址对齐出错,比如访问一个4字节的整数, 但其地址不是4的倍数
#define SIGFPE 8 // 计算错误,比如除0、溢出
#define SIGKILL 9 // 强制结束程序,具有最高优先级,本信号不能被阻塞、处理和忽略
#define SIGUSR1 10 // 未使用,保留
#define SIGSEGV 11 // 非法内存操作,与SIGBUS不同,他是对合法地址的非法访问,比如访问没有读权限的内存,向没有写权限的地址写数据
#define SIGUSR2 12 // 未使用,保留
#define SIGPIPE 13 // 管道破裂,通常在进程间通信产生
#define SIGALRM 14 // 定时信号,
#define SIGTERM 15 // 结束程序,类似温和的SIGKILL,可被阻塞和处理。通常程序如果终止不了,才会尝试SIGKILL
#define SIGSTKFLT 16  // 协处理器堆栈错误
#define SIGCHLD 17 // 子进程结束时, 父进程会收到这个信号。
#define SIGCONT 18 // 让一个停止的进程继续执行
#define SIGSTOP 19 // 停止进程,本信号不能被阻塞,处理或忽略
#define SIGTSTP 20 // 停止进程,但该信号可以被处理和忽略
#define SIGTTIN 21 // 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号
#define SIGTTOU 22 // 类似于SIGTTIN, 但在写终端时收到
#define SIGURG 23 // 有紧急数据或out-of-band数据到达socket时产生
#define SIGXCPU 24 // 超过CPU时间资源限制时发出
#define SIGXFSZ 25 // 当进程企图扩大文件以至于超过文件大小资源限制
#define SIGVTALRM 26 // 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
#define SIGPROF 27 // 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间
#define SIGWINCH 28 // 窗口大小改变时发出
#define SIGIO 29 // 文件描述符准备就绪, 可以开始进行输入/输出操作
#define SIGPOLL SIGIO // 同上,别称
#define SIGPWR 30 // 电源异常
#define SIGSYS 31 // 非法的系统调用

文章来源:https://blog.csdn.net/Crystal_lpx/article/details/135480740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。