Android Native崩溃收集原理及实现

2,502 阅读1分钟

1.概述

C/C++崩溃处理是android开发中相对比较麻烦的地方。目前有商业化的统计sdk可以支持,如bugly。

2.原理

Android系统是基于linux实现的。linux中当产生崩溃时系统会向当前进程中发送一个信号量,表示进程异常。我们可以拦截这个信号量,然后此时保存当前系统镜像,生成dump文件。

并上传到服务器,在后台进行分析。

3.实现

目前比较流行的是google提供的开源框架google-breakpad.这是一个跨平台的c/c++崩溃捕获工具。具体使用步骤如下:

  1. 编译google-breakpad android部分,生成一个静态库。
  2. 自己写一个jni库,调用静态库中的方法,传入崩溃文件的保存目录和崩溃回调。
  3. 在回调中处理崩溃。例如:上传dump文件。

解析流程如下:

  1. 首先用dump_syms工具根据so文件导出符号表文件。
  2. 其次用minidump_stackwalk工具针对符号表和dump文件,还原出调用堆栈。
  3. 用addr2line根据pc指针地址,找到对应的源代码行号。

举例说明:

1.手动制造崩溃,获取崩溃文件:

2. 生成符号表

./dump_syms libnativecrashcapture.so > ./dumpsym/libnativecrashcapture.so.sym

3. 解析dump文件

./minidump_stackwalk_linux c92f2405-e612-4fb8-ad7628be-f13149b9.dmp ./dumpsym/ dumpdetail3.txt

4. 定位崩溃具体位置

4. 参考文献

juejin.cn/post/684490…

www.chromium.org/developers/…

www.cnblogs.com/songtzu/arc…

github.com/google/brea…