使用breakpad收集native奔溃日志及dump解析
本文是学习使用breakpad的一个总结,在这过程中看了很多博客,但是相对有用的有以下几篇:
环境:win10 linux 子系统,ubuntu 20,android-ndk-r20
一、源码编译
先到github下载google/breakpad的源码,在ubuntu下编译。
总共遇到了三个问题(实际算两个问题),基本没什么大问题即可编译成功。
1.1 文件结尾问题
用windows的git clone代码有这个文件结尾的问题,导致各种失败。直接在ubuntu中clone代码可以避免这种麻烦。
1.2 找不到文件:third_party/lss/linux_syscall_support.h
fatal error: third_party/lss/linux_syscall_support.h: No such file or directory
去这个仓库linux-syscall-support下载并丢到对应目录即可
1.3 "rsp"过时导致失败
下载2这个文件后编译报错:
./src/third_party/lss/linux_syscall_support.h:2146:75: error: listing the stack pointer register ‘rsp’ in a clobber list is deprecated [-Werror=deprecated]
2146 | : “rsp”, “memory”, “r8”, “r10”, “r11”, “rcx”);
根据提示,定位到代码,把"rsp"从列表中删除即可
1.4 编译结果
- client: /src/client/linux/libbreakpad_client.a,此文件可以编译进android 的app,完成native crash的捕捉和生成minidump文件;
- dump_syms: /src/tools/linux/dump_syms,用于提取so库的sym符号文件;
- minidump_stackwalk: /src/processor/minidump_stackwalk,用于将.dmp minudump文件和.sym文件合成可读的堆栈信息;
二、接入breakpad(奔溃收集堆栈信息)
可参考Android使用Google Breakpad进行崩溃日志管理
三、解析dump
linux 环境下进行
3.1 准备工作
将以下文件拷贝到一个目录(如果不拷贝到同一个目录则需要在不同的目录执行):
- /src/tools/linux/dump_syms/dump_syms
- /src/processor/minidump_stackwalk
- 准备带符号表的so(build\intermediates\CXX\debug)
- 准备收集到的奔溃堆栈文件(如:fde85952-3123-497b-83708b84-58dd1e16.dmp)
3.2 解析dump
假设so:libbreakpad
# 1.dump_syms 提取特定so库的符号信息
./dump_syms libbreakpad.so > libbreakpad.so.sym
head -n1 libbreakpad.so.sym
# MODULE Linux arm64 659648E1F0DF9DFFD7E92A56FED08B930 libbreakpad.so
# 2.根据上面的生成目录结构,libbreakpad.sym移动到该目录