Breakpad 跨平台崩溃报告系统 入门指南

说明:这是Chinese-house上的翻译,那儿还有更多

Breakpad 既是一个函数库又是一个工具箱,它让你可以在发布应用程序给用户时移除编译器提供的调试信息,它会在一种简洁的"minidump"格式的文件中记录程序崩溃信息,并发送回你的服务器,而且可以从这些minidump文件中处理得到 C 和 C++ 堆栈记录(stack trace). Breakpad 也可以按要求给没有崩溃的程序写minidump文件.

Breakpad 正被 Google Chrome, Firefox, Google Picasa, Camino, Google Earth 和别的一些项目使用.

Breakpad 有三个主要部分:

  • 客户端(client) 是一个可以包含在程序中的库. 它可以把当前线程的状态和已装载的可执行库跟共享库的标识符写进minidump文件. 你可以配置客户端在程序崩溃时写一个minidump或只有显式要求时才写.
  • 符号清洁工(symbol dumper)是一个读取编译器产生的信息的程序,它能在读取后产生一个符号文件(symbol file),这个文件的格式是
  • 处理器(processor)是也是一个程序,他读取minidump文件,并给minidump文件提到的可执行库和共享库找到合适的符号文件,然后产生一个可读的 C/C++ 堆栈记录.

minidump文件格式

minidump文件格式类似于微软为崩溃上传功能(crash-uploading facility)开发的内核文件(core files). minidump 文件包含:

  • 一个在垃圾场(dump)创建时系统加载的可执行库和共享库的列表. 这个列表包含文件名和已装载版本的文件的标识符.
  • 当前进程中的线程列表. 对于每一个线程, minidump 文件包含了处理器的寄存器的状态和线程的堆栈内存. 这些数据是不能解读的字节流, 因为Breakpad 客户端一般没有可用的调试信息来产生函数名或行号,甚至识别堆栈框架的边界.
  • 收集到的创建垃圾场的系统的其他信息: 处理器、操作系统版本和垃圾场产生原因等等.

Breakpad 在所有平台上使用 Windows minidump 文件, 而不是传统的内核文件(core files), 有这些原因:

  • 内核文件会很大,这使得把它们通过网络传送到收集器端进行处理很不使用. Minidump 文件更小,因为它们就是为了这么用而设计的.
  • 核心文件格式不规范. 比如, Linux标准库(Linux Standards Base) 没有描述寄存器是如何存储在 PT_NOTE 段中的.
  • 与让别的机器写minidump文件相比,让windows机器处理核心会更难.
  • 它使 Breakpad 处理器简化到只需支持一种文件格式.

minidump 是通过调用 Breakpad库产生的. 默认情况下,初始化Breakpad会安装一个异常/信号处理器,这个处理器会在异常出现时会写一个minidump文件到硬盘. 在 Windows 上, 这是通过SetUnhandledExceptionFilter()完成的; 在 OS X 上, 这是通过创建一个在Mach 异常端口的线程完成的; 在Linux 上, 这是通过安装多种异常(如SIGILL, SIGSEGV等)的信号处理句柄完成的.

在minidump文件产生后,每个平台都有稍微不同与其他平台的上传崩溃crash dump. 在 Windows和 Linux, 有一个独立的函数库可以调用去上传. 在 OS X, 如何设置好了,就会产生一个独立的进程,请求用户权限,然后发送这个文件.

进程内(In-process) vs. 进程外(out-of-process)异常处理 - 一般认为在崩溃的进程中写minidump文件不安全- 关键进程数据结构会被破坏,或者异常处理句柄所在堆栈会被覆盖,等等。所有三个平台都支持进程外异常处理.

所有的客户端 代码都能通过访问在

  • processor 包含了只在服务器端使用的 minidump处理代码
  • client 包含了所有平台的客户端产生minidump的函数库。
  • tools 包含了每个平台下编译一系列工具的源码和工程。

(在别的目录中)

建立进程的细节(符号产生)

这可用于所有的平台。在src/tools/{platform}/dump_syms 中是一个可以读取各个平台下调试信息和产生Breakpad 符号文件的的工具(如 X/Linux的DWARF 和 STABS, Windows的PDB 文件),它还能产生一个Breakpad符号文件. 这个工具在剥离之前在运行(on your binary before it's stripped)(在OS X/Linux上) 而且符号文件要放在minidump 处理器可以找的到的地方.有另外一个工具, symupload,如果你写了可以接收它们的服务器,可以用来上传符号文件.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Breakpad 是一个开源的崩溃报告库,它可以捕获应用程序的崩溃信息,生成崩溃报告,以便于开发人员进行分析和修复。 要捕获 C++ 标准库的崩溃,需要使用 Breakpad 提供的异常处理机制。在 C++ 中,异常是通过 `try-catch` 语句块来处理的,当程序遇到异常时,会跳转到相应的 `catch` 块中进行处理。Breakpad 利用这个机制,在 `catch` 块中捕获异常并生成崩溃报告。 具体的实现步骤如下: 1. 在应用程序中使用 Breakpad 库,将崩溃信息保存到指定的文件中。 2. 在程序中使用 `try-catch` 语句块捕获异常。 3. 在 `catch` 块中,调用 Breakpad 提供的函数,将崩溃信息写入文件。 以下是一个使用 Breakpad 捕获 C++ 标准库崩溃的示例代码: ```c++ #include <stdexcept> #include "client/linux/handler/exception_handler.h" bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { // 将崩溃信息写入文件 return succeeded; } int main() { // 创建 Breakpad 异常处理器 google_breakpad::MinidumpDescriptor descriptor("."); google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1); try { // 在这里写下可能会抛出异常的代码 throw std::runtime_error("C++ 标准库崩溃"); } catch (...) { // 在 catch 块中调用 Breakpad 的 WriteMinidump 函数 eh.WriteMinidump(); } return 0; } ``` 在上面的代码中,`DumpCallback` 函数用于将崩溃信息写入文件,`main` 函数中创建了一个 Breakpad 异常处理器,并在 `try-catch` 语句块中捕获异常。当程序遇到异常时,会跳转到 `catch` 块中,调用 Breakpad 的 `WriteMinidump` 函数将崩溃信息写入文件。 需要注意的是,使用 Breakpad 捕获崩溃信息时,需要在编译时链接 Breakpad 库,并将 Breakpad 的头文件包含在程序中。同时,需要在程序中注册异常处理器,以便于在发生异常时能够捕获崩溃信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值