获取调用栈四种方案: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 // 非法的系统调用