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”可用于上传符号文件。

posted @ 2020-09-21 11:37  streamlet_hy  阅读(806)  评论(0编辑  收藏  举报