使用 breakpad 捕获 native crash
目录
使用 breakpad 捕获 native crash
在以下环境测试通过
- CPU: Intel 10710U
- OS: macOS Catalina 10.15.7
- buildSDK: 31, NDK: 21
- kotlin 1.6.x, gradle 7.x, AGP 7.x
- Device: Redmi K40 & Android 11
安装
- clone breakpad
|
|
- 由于 Breakpad 依赖于 LSS,因此需要下载 LSS, 并将
linux_syscall_support.h
文件放至breakpad/src/third_party/lss/
- 编译 breakpad, 我们就可以看到 libbreakpad.a 文件
|
|
捕获
-
如何 CMake HelloWorld: Google Code lab, 事实上 Android Studio 自带有在项目中导入 C++ 支持的一键方式,很是方便
-
Android Studio 具有一键生成 JNI 函数,用起来还是很方便的:
-
在 cpp 中初始化这俩玩意,然后引发 native crash 就好了:
1 2
MinidumpDescriptor descriptor(path); // 这个 path 填一个文件夹 static ExceptionHandler eh(descriptor, nullptr, DumpCallback, nullptr, true, -1);
分析
-
拉取手机端在指定路径下的 dmp 文件
-
找到编译后的 so 文件: 一般在 build 文件夹下,比如我在:
/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libbreakpadapp.so
,个人建议也可以在编译后的 apk 里面解压拿,这样比较方便
生成符号表(不必须)
-
获取
dump_syms
的可执行文件,以下方法任选其一:- 找到对应的工具源码文件所在位置:如 macOS:
breakpad/src/tools/mac
,在 Xcode 中打开 dump_syms.xcodeproj 并编译即可得到dump_syms
可执行文件 - 若安装了
Rust
,也可以使用另一个用 Rust 编写的 dump_syms 工具: mozilla/dump_syms, 运行cargo build
来得到dump_syms
可执行文件
- 找到对应的工具源码文件所在位置:如 macOS:
-
生成 syms 文件:
1
./dump_syms libbreakpadapp.so > app.syms
-
制作指定的目录结构:
1 2
head -n1 app.syms # MODULE Linux arm64 EB6D20434806296679496154A2365F410 libbreakpadapp.so
通过输出,创建指定的文件夹,并将 syms 文件放入其中:
1 2
mkdir -p ./syms/libbreakpadapp.so/EB...0/ # 根据上一步输出 mv app.syms ./syms/libbreakpadapp.so/EB...0/ # 放入符号文件
分析 dump 文件:
分析 dump 的话,符号表文件 syms 其实不必须,直接 ./minidump_stackwalk 1.dmp
也没问题
|
|
可以得到如下,其中标有 (crashed)
的即为崩溃线程
|
|
我们还可以使用 ndk 中 (Android/sdk/ndk/21.4.7075529/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin) 提供的addr2line
来通过地址符号反解:
|
|