Google Breakpad:基本介绍和操作方法

1、基本简介

Breakpad 是一套用于抓取应用崩溃数据的工具。Breakpad 可以在移除编译器调试信息后,抓取、压缩minidump信息,将其发送回你的服务器,然后为 C/C++ 生成调用栈。尽管 Google Breakpad 将自己定位成一个崩溃报告工具, 但实际上它更像一个调试辅助工具。Breakpad 的特点主要在于崩溃报告部分支持无符号抓取。整套工具实现了在客户使用无符号的发布版应用前提下, 开发者也能以较低代价恢复应用崩溃现场的调用栈。

1.1 三大组件

Breakpad 包含三大组件:

  1. client:读取当前线程的状态、加载的可执行文件、共享库等信息,写入到minidump中。可以放到应用中,当崩溃发生时自动使用,或者显式调用;
  2. symbol dumper:读取编译器生成的调试信息,产生基于 Breakpad 格式 的 symbol file;
  3. processor:读取minidump寻找适合的 symbol file,生成可读的 C/C++ 调用栈。

在这里插入图片描述

1.2 minidump的文件格式

minidump是微软开发的和核心文件类似的文件格式。它包含:

  1. 该进程已加载的可执行文件和共享库列表,包括名称和版本;
  2. 进程中所有现场的列表,包括每个线程的寄存器状态、栈内容(纯字节流);
  3. 其他的系统信息,包括处理器、操作系统、崩溃原因等等。

1.3 minidump概览

默认情况下,Breakpad初始化时注册一个异常或信号处理函数,该函数能在异常发生时生成 minidump。注册方法依赖于平台。

  1. Windows中使用SetUnhandledExceptionFilter();

  2. OS X 中创建一个线程来等待 Mach 例外端口;

  3. Linux 中安装一个能处理像 SIGSEGV、SIGKILL 之类例外的信号处理函数。

    上传崩溃现场的方法也有所不同

  4. 在 Windows 和 Linux 中, 调用一个独立的函数库上次;

  5. 在 OS X 中, 会有一个进程来请求用户授权上传操作。

1.4 Breakpad组件

src目录下有三个目录

  1. client,包含所有平台的minidump生成器;
  2. processor,用于服务端处理minidump;
  3. tools,包含构建工具的源代码。
  4. c/tools/{platform}/dump_sys 用于在给库去符号之前生成 Breakpad 符号文件。

1.5 Breakpad Client库

Breakpad Client 库用于监视应用的崩溃,并收集、上传数据。这主要通过异常/信号处理函数实现。由于应用运行在的处理器和操作系统可能不同,Client 的设计变化较大。Client 库和用来发送快照的库会链接成应用的一部分。异常在不同平台有不同表现,Breakpad在ExceptionHandler对象中设置了处理函数。具体的内部实现依平台而异。

2、操作方法

2.1 编译整合

  1. 进入到breakpad源码目录 ./configure && make 生成
  2. src/client/linux/libbreakpad_client.a
  3. 生成/src/tools/linux/dump_syms/dump_syms
  4. 生成/src/processor/minidump_stackwalk
  5. 把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 生成符号文件

  1. /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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WuChengqian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值