按照张邵文老师在极客专栏的建议,熟悉一下 c 代码的崩溃和分析流程。
breakPad 是谷歌开源的工具,可用来采集和分析 c 代码的崩溃信息。
整体流程不复杂,可分为以下几步:
1.导入邵文老师在 github 的 sample 工程(建议保证环境能够科学上网,要下载不少东西),在手机上运行点击崩溃按钮,手机 sdcard 上新增了崩溃日志。
2.接下来就要使用 minidump_stackwalker 工具来解析崩溃日志了。自己在这一步卡了很长时间:
邵文老师提供的 minidump_stackwalker 工具是在 mac 环境编译出的,我这里是 Ubuntu 环境,不能直接使用,需要自己重新编译出 minidump_stackwalker 工具。一开始时按照 https://github.com/google/breakpad 的方法尝试编译,下载 depot_tools 工具后,fetch breakpad 老是失败,上网搜了不少方法,还是没有解决 fetch breakpad 失败的问题。后来自己想了想,fetch breakpad 实际上就是拉取 breakpad 的源码,既然通过 depot_tools 工具下载失败,直接从 github 上把 breakpad 源码 clone 下来不就好了。从 github 上 clone 下源码后,进入源码目录 cd src 然后 ./configure && make,这时会报错缺少文件third_party/lss/linux_syscall_support.h , 需要在源码根目录下创建 third_party/lss,然后去 https://chromium.googlesource.com/linux-syscall-support/+/refs/heads/master 下载 linux-syscall-support-refs_heads_master.tar.gz 并解压文件到 third_party/lss 目录下,此时再 ./configure && make 即可成功编译。编译成功后在源码根目录下进入 /src/processor目录就能发现 minidump_stackwalker 工具已经生成出来了。
3.使用 minidump_stackwalk crashDump/*.dmp >crashLog.txt 生成堆栈跟踪log。打开文件
后可看到:
|
|
由日志可以看出崩溃原因时原因为 libcrash-lib.so 的代码里出现空指针了,此时记录下地址 0X600
4.符号解析,可以使用 ndk 中提供的addr2line来根据地址进行一个符号反解的过程.
|
|