breakpad系列(1)——起步
原文来自breakpad目录中doc目录下的getting_started_with_breakpad文档,建议去看原文!
介绍
Breakpad是一个比Linux core机制更强大的、用于记录程序崩溃时信息的工具。
Breakpad是一个库和工具套件,可用来发布删除了编译器调试信息的应用程序。在程序崩溃时,将崩溃信息记录在一个小巧的“ minidump”文件中,将其发送回服务器。并且可以从这些minidump和符号文件来生成C和C++堆栈跟踪。
Breakpad还可以按照要求为没有崩溃的程序编写minidump文件(意思就是可以自动调用相关接口,生成minidump文件)。
目前,Google Chrome,Firefox,Google Picasa,Camino,Google Earth等项目已经在使用Breakpad。
下图为breakpad工作示意图。可以注意到一个程序组成为:程序本身的代码、breakpad 客户端信息、调试信息。程序发布时是没有调试信息的。
Breakpad具有三个主要组件:
- client :是需要包含在你自己应用程序的一个库,它可以生成minidump文件、捕获当前线程的状态、当前加载的可执行文件和共享库的标识。你可以自行决定在发生崩溃或明确请求时写minidump文件。
- symbol dumper :读取编译器生成的调试信息,然后按照[Breakpad自己的格式](symbol_files.md)生成 symbol file(符号文件)。
- processor :读minidump文件,查找minidump中记录的可执行文件和共享库的相关符号文件,生成直观可读的C/C++堆栈信息。
minidump文件格式
minidump文件格式类似于core文件,由Microsoft开发,用于其崩溃上传功能。 一个小型转储文件包含:
- dump文件生成时,进程中加载的可执行文件和共享库列表。此列表包括文件名和已加载文件的特定版本的标识符。
- 进程中存在的线程列表。 对于每个线程,minidump文件包括处理器寄存器的状态以及线程堆栈存储器的内容。 这些数据都是未解释的字节流,因为Breakpad client中通常没有可用于产生函数名称或行号,甚至标识堆栈边界的调试信息。
- 收集产生dump 系统的其他信息:处理器和操作系统版本,产生dump的原因等等。
- Breakpad在所有平台上都使用Windows minidump文件而不是传统的core文件,原因如下:
- core文件可能非常大,使其难以通过网络发送回服务器上进行处理。 minidump较小,是因为它们最开始就被设计为以这种方式使用。
- core文件格式的文档很少。 例如,Linux Standards Base没有描述寄存器如何存储在“ PT_NOTE”段中。
- 说服Windows计算机生成core转储文件比说服其他计算机使用minidump文件更难。
- 简化了Breakpad processor,使其仅支持一种文件格式。
minidump的概述/生命周期
通过调用Breakpad库生成minidump文件。 默认初始化Breakpad时将安装一个异常/信号处理程序,该异常/信号处理程序将在异常产生时将写minidump到磁盘。
在Windows上,这是通过以下方式完成的`SetUnhandledExceptionFilter()`;在OS X上,这是通过创建一个等待Mach异常端口的线程来完成的; 在Linux上,这是通过为各种信号(例如SIGILL,SIGSEGV等)处理程序来完成的。
生成minimudp文件后,每个平台上传dump的方式都会稍有不同。在Windows和Linux上,提供了一个单独的函数库,可以调用它们进行上传。 在OS X上,将生成一个单独的进程,该进程会提示用户进行许可(如果配置为许可)并发送文件。
术语
In-process vs. out-of-process exception handling :通常认为从崩溃的进程内写入minidump是不安全的-关键进程数据结构可能会损坏,或者运行异常处理程序的堆栈可能会损坏 已被覆盖,等等。所有3个平台都支持所谓的“out-of-process(进程外)”异常处理。
综述
Breakpad代码概述
可以通过访问Google Project找到所有客户端代码。https://chromium.googlesource.com/breakpad/breakpad(这个网站需要FQ,所以还是去github上吧)。 src目录中存在以下目录结构:
- processor :包含服务器端使用的minidump处理代码,而客户端不使用
- client :包含所有平台的客户端,用于生成minidump的库
- tools :包含用于在每个平台上构建各种工具的源代码和项目。
构建过程细节(符号生成)
这适用于所有平台。在`src/tools/{platform}/dump_syms` 内部,该工具可以读取每个平台的调试信息(例如,对于OS X / Linux,DWARF和STABS,对于Windows,PDB文件)并生成Breakpad符号文件。
该工具应在二进制文件剥离之前运行(对于OS X / Linux),并且符号文件需要存储在minidump处理器可以找到的位置。
如果编写了可以接收符号文件的服务器,则还有另一个工具“ symupload”可用于上传符号文件。