Breakpad使用(window)

Chromium的Breakpad是目前Native崩溃捕获中最成熟的方案,这里参考下Android高手课中的Demo,来学习下怎么使用

1.Chapter01


例子里集成了Breakpad 来获取发生 native crash 时候的系统信息和线程堆栈信息。通过一个简单的 Native 崩溃捕获过程,完成 minidump 文件的生成和解析,在实践中加深对 Breakpad 工作机制的认识。

只是Demo里面提供的minidump_stackwalk可能由于环境不同,无法启动,所以需要单独编译。在网上找到一种不需要编译的情况,这里记录下window情况下的使用。

2.生存崩溃日志


运行的Demo界面

Breakpad使用(window)_第1张图片

点击CRASH,授权的情况下,会在SD卡的crashDump目录下生成dmp文件,应用程序会闪退

3.解析dmp文件


解析的文件是minidump_stackwalk,Android Studio的安装目录下bin\lldb\bin就存在这么一个执行文件(我用的是Windows 10),接下来试下,将生成的dmp拷贝到当前目录下,然后执行命令

./minidump_stackwalk.exe test.dmp >test.txt

解析的结果存放到test.txt文件中

Breakpad使用(window)_第2张图片
从.dmp文件解析出来的信息,,根据Android 平台 Native 代码的崩溃捕获机制及实现,可以知道Crash reason: SIGSEGV代表那种类型的错误:

SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
Thread 0 (crashed) // crash 发生时候的线程
 0  libcrash-lib.so + 0x5f0 // 发生 crash 的位置和寄存器信息 

4.符号解析


可以使用Android NDK中提供的addr2line来根据地址进行一个符号反解的过程,该工具在Android SDK目录下可以找到。工具链的选择要根据.so的类型来决定,看解析后的文件,有显示CPU信息。下面是NDK 17的工具链目录:

Breakpad使用(window)_第3张图片
如果是arm-64位的so,解析是需要使用aarch64-linux-android-4.9下的工具链。
如果是arm-32位的so,解析是需要使用arm-linux-androideabi-4.9下的工具链。
如果是x86-64位的so,解析是需要使用x86_64-4.9下的工具链。
如果是x86-32位的so,解析是需要使用x86-4.9下的工具链。

这里的CUP信息是arm64,所以对应的目录是

Breakpad使用(window)_第4张图片

将so文件拷贝到这个目录,so路径是

Breakpad使用(window)_第5张图片

执行命令

 ./aarch64-linux-android-addr2line.exe -f -C -e libcrash-lib.so 0x5f0

结果如下

在这里插入图片描述

Breakpad使用(window)_第6张图片

可以看到解析的错误信息和代码里面的位置一致。

5.参考


1.https://blog.csdn.net/qq_17766199/article/details/85716750
2.https://github.com/AndroidAdvanceWithGeektime/Chapter01
3.https://www.jianshu.com/p/0bfe7800bdef
4.https://www.jianshu.com/p/1687c92efb89

你可能感兴趣的:(android)