1、基本简介
Breakpad 是一套用于抓取应用崩溃数据的工具。Breakpad 可以在移除编译器调试信息后,抓取、压缩minidump信息,将其发送回你的服务器,然后为 C/C++ 生成调用栈。尽管 Google Breakpad 将自己定位成一个崩溃报告工具, 但实际上它更像一个调试辅助工具。Breakpad 的特点主要在于崩溃报告部分支持无符号抓取。整套工具实现了在客户使用无符号的发布版应用前提下, 开发者也能以较低代价恢复应用崩溃现场的调用栈。
1.1 三大组件
Breakpad 包含三大组件:
- client:读取当前线程的状态、加载的可执行文件、共享库等信息,写入到minidump中。可以放到应用中,当崩溃发生时自动使用,或者显式调用;
- symbol dumper:读取编译器生成的调试信息,产生基于 Breakpad 格式 的 symbol file;
- processor:读取minidump寻找适合的 symbol file,生成可读的 C/C++ 调用栈。
1.2 minidump的文件格式
minidump是微软开发的和核心文件类似的文件格式。它包含:
- 该进程已加载的可执行文件和共享库列表,包括名称和版本;
- 进程中所有现场的列表,包括每个线程的寄存器状态、栈内容(纯字节流);
- 其他的系统信息,包括处理器、操作系统、崩溃原因等等。
1.3 minidump概览
默认情况下,Breakpad初始化时注册一个异常或信号处理函数,该函数能在异常发生时生成 minidump。注册方法依赖于平台。
-
Windows中使用SetUnhandledExceptionFilter();
-
OS X 中创建一个线程来等待 Mach 例外端口;
-
Linux 中安装一个能处理像 SIGSEGV、SIGKILL 之类例外的信号处理函数。
上传崩溃现场的方法也有所不同
-
在 Windows 和 Linux 中, 调用一个独立的函数库上次;
-
在 OS X 中, 会有一个进程来请求用户授权上传操作。
1.4 Breakpad组件
src目录下有三个目录
- client,包含所有平台的minidump生成器;
- processor,用于服务端处理minidump;
- tools,包含构建工具的源代码。
- c/tools/{platform}/dump_sys 用于在给库去符号之前生成 Breakpad 符号文件。
1.5 Breakpad Client库
Breakpad Client 库用于监视应用的崩溃,并收集、上传数据。这主要通过异常/信号处理函数实现。由于应用运行在的处理器和操作系统可能不同,Client 的设计变化较大。Client 库和用来发送快照的库会链接成应用的一部分。异常在不同平台有不同表现,Breakpad在ExceptionHandler对象中设置了处理函数。具体的内部实现依平台而异。
2、操作方法
2.1 编译整合
- 进入到breakpad源码目录 ./configure && make 生成
- src/client/linux/libbreakpad_client.a
- 生成/src/tools/linux/dump_syms/dump_syms
- 生成/src/processor/minidump_stackwalk
- 把libbreakpad_client.a链接进你的程序,把src目录include进去 编写代码指定dump文件路径和回调处理。
#include "client/linux/handler/exception_handler.h"
g++ -g test.cc -I. -L./client/linux/ -lbreakpad_client -lpthread -o test
static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded)
{
printf("Dump path: %s\n", descriptor.path());
return succeeded;
}
void crash()
{
volatile int* a = (int*)(NULL);
*a = 1;
}
int main(int argc, char* argv[])
{
google_breakpad::MinidumpDescriptor descriptor("/tmp");
google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1);
crash();
return 0;
}
2.2 生成符号文件
- /home/wuchengqian/GW-ECU/libs/third-party/breakpad/src/tools/linux/dump_syms/dump_syms
./utest-others > ~/tmp/utest-others.sym
2.3 查看符号文件信息
head -n1 test.sym // 获取基本信息 MODULE Linux x86_64 55BB963CBC37A2BCCED189502FD1AA310 utest-others
mkdir -p ./symbols/utest-others/55BB963CBC37A2BCCED189502FD1AA310 // 创建该符号文件处理的专门文件夹
mv test.sym ./symbols/utest-others/55BB963CBC37A2BCCED189502FD1AA310 // 将符号文件移动号这和专门的文件夹下
2.4 生产堆栈信息
/home/wuchengqian/GW-ECU/libs/third-party/breakpad/src/processor/minidump_stackwalk 0422e62a-2d7c-4381-cf687d94-a06134ee.dmp ./symbols >> debug.txt
symbolstore.py 这个 Mozilla 的脚本能搞定上边几步。
Usage: symbolstore.py <params> <dump_syms path> <symbol store path> <debug info files or dirs>
例:./symbolstore.py ./tools/linux/dump_syms/dump_syms symbols test