Google Breakpad 崩溃收集系统详解

QuibblerQuibbler 2020-01-18 约 9 分钟 187 次阅读

Google Breakpad 崩溃收集系统详解

Google Breakpad 是一套开源的跨平台崩溃报告系统,由客户端库、符号卸载器和 Minidump 处理器三大组件构成。它能在应用程序崩溃时生成紧凑的 dump 文件,并通过符号解析还原出可读的 C/C++ 堆栈跟踪,是 Native 层 Crash 收集的行业标准方案。

1、工具概述

在 Android 开发中,JNI 层的 Crash 问题一直是个痛点。相比 Java 层有完整的 Exception StackTrace,C/C++ 造成的崩溃缺乏可读的错误信息,定位问题非常困难。Google Breakpad 正是解决这一问题的利器。

1.1、核心定位

Breakpad 是一个库和工具套件,可以让发布的应用程序(剥离编译器调试信息后)在崩溃时记录紧凑的 dump 文件,发送回服务器,并从中产生 C/C++ 堆栈踪迹。它也可以让未崩溃的程序按需写出 minidump。

1.2、三大组件

• 客户端(Client):包含在应用程序中的库,获取当前线程状态和已加载的可执行文件及共享库 ID,写入 dump 文件
       • 符号卸载器(Symbolicator):读取编译器产生的调试信息,生成 Breakpad 格式的符号文件
       • 处理器(Processor):读取 minidump 文件,结合对应版本的符号文件,产生人可读的 C/C++ 堆栈跟踪

1.3、开源地址

• GitHub:https://github.com/google/breakpad
       • 官方仓库:https://chromium.googlesource.com/breakpad/breakpad
       • 许可证:BSD 3-Clause

2、源码下载与编译

Breakpad 的编译过程相对复杂,涉及多个依赖仓库和 NDK 开发知识。

2.1、获取源码

需要先安装 depot_tools 工具,然后通过 fetch 命令拉取源码:

# 下载 depot_tools 并确保在 PATH 中
mkdir breakpad && cd breakpad
fetch breakpad
cd src

2.2、编译构建

# 配置并编译
./configure && make

# 运行测试(可选)
make check

# 安装(可选)
make install

编译产物包括处理器工具(minidump_stackwalk、minidump_dump 等),在 Linux 上还会编译客户端库和工具(dump_syms、minidump-2-core 等)。

2.3、Android 平台编译

Android 平台需要使用 NDK 编译,项目提供了 README.ANDROID 文件说明编译流程。核心是通过 CMakeLists.txt 或 Android.mk 配置 NDK 构建:

android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a", "x86"
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

3、Android 项目集成

将编译好的 Breakpad 库集成到 Android 项目中,只需初始化即可自动捕获 Native Crash。

3.1、添加依赖

引用编译好的 aar 包或直接依赖 breakpad library 模块:

dependencies {
    implementation project(":breakpad-build")
}

3.2、初始化 Breakpad

在 Application 中进行初始化,指定 crash dump 文件的保存路径:

BreakpadInit.initBreakpad(externalReportPath.getAbsolutePath());

初始化后,当 Native 层发生崩溃时,Breakpad 会自动在指定路径生成 .dmp 格式的 minidump 文件。

4、Crash 日志分析

生成 dump 文件后,需要使用 Breakpad 工具链进行解析,还原可读的堆栈信息。

4.1、Minidump 解析

使用 minidump_stackwalk 工具解析 dump 文件:

# 不同平台使用对应目录下的工具
./tools/mac/minidump_stackwalk crashDump/*.dmp > crash_report.txt

输出结果示例:

Operating system: Android
                  0.0.0 Linux 3.10.73 aarch64
CPU: arm64
Crash reason:  SIGSEGV /SEGV_MAPERR
Crash address: 0x0
Thread 0 (crashed)
 0  libnative-lib.so + 0x6fe0
    x0 = 0x0000007e4d8cb1c0    x1 = 0x0000007fd17ceb14
    x2 = 0x0000007fd17ceba0    x3 = 0x0000007e4d43ea74
    ...

4.2、错误类型解读

• SIGSEGV / SEGV_MAPERR — 进程执行了无效的内存引用,即段错误
       • SIGABRT — 程序调用了 abort(),通常由断言失败触发
       • SIGBUS — 总线错误,通常为内存对齐问题
       • SIGFPE — 浮点异常,如除以零

4.3、符号解析(addr2line)

使用 NDK 提供的 addr2line 工具将地址还原为函数名和代码行号:

# 使用 addr2line 反解崩溃地址
arm-linux-androideabi-addr2line -f -C -e libcrash-lib.so 0x6fe0

# 输出结果
Crash()

addr2line 工具位于 NDK 的 toolchains 目录下:

$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line

5、工作流程总结

Breakpad 的完整工作流程如下:
       1. 集成 Breakpad 客户端库到项目中,初始化并指定 dump 保存路径
       2. 应用运行时发生 Native Crash,Breakpad 自动捕获并生成 .dmp 文件
       3. 收集 dump 文件,使用 minidump_stackwalk 解析出崩溃信息和寄存器状态
       4. 使用 addr2line 将崩溃地址反解为具体的函数名和代码行号
       5. 根据解析结果定位问题代码,进行修复

6、总结

Google Breakpad 是 Native 层崩溃收集的行业标准方案,Chrome、Firefox 等大型项目都在使用。它提供了从崩溃捕获到符号解析的完整工具链,跨平台支持 Linux、macOS、Windows 和 Android。虽然编译和集成过程有一定复杂度,但一旦配置完成,就能极大地提升 Native Crash 的定位效率,是 Android JNI 开发者必备的调试工具。

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w