Breakpad 入门

简介

Breakpad 是一个库和工具集,它使你可以给用户分发移除了编译器提供的调试信息的应用程序,但以兼容 "minidump" 的文件格式记录崩溃,把它们发送回你的服务器,并从这些 minidumps 生成 C 和 C++ 的栈追踪。Breakpad 也可以在收到请求时写入没有崩溃的程序的 minidumps。

Breakpad 当前已经用在了 Google Chrome,Firefox,Google Picasa,Camino,Google Earth,及其它许多项目中。

breakpad.png

Breakpad 有三个主要的组件:

  • client 是你包含在你的应用程序中的库。它可以写入 minidump 文件,捕获当前线程的状态,以及当前加载的可执行文件和共享库的识别信息。你可以配置客户端在崩溃发生时,或在显式请求时写入 minidump。

  • symbol dumper 是一个读取编译器产生的调试信息,并生成 符号文件 的程序,以 Breakpad 自己的格式

  • processor 是读取 minidump 文件,为 minidump 涉及的可执行文件和共享库版本,查找适当的符号文件,并生成一个人类可读的 C/C++ 栈追踪。

minidump 文件格式

minidump 文件格式类似于 core 文件,但它是由 Microsoft 为它们的崩溃上报设施开发的。一个 minidump 文件包含:

  • 创建 dump 时进程中加载的可执行文件和共享库的列表。这个列表包含加载的那些文件的特定版本的文件名和标识符。

  • 进程中出现的线程。对于每个线程,minidump 包含处理器寄存器的状态,以及线程的栈内存的内容。这些数据都是未经解释的字节流,Breakpad 客户端通常没有调试信息可用来生成函数名或行号,或者甚至识别栈帧边界。

  • 关于收集 dump 所在的系统的其它信息:处理器和操作系统版本,dump 的原因,等等等。

Breakpad 在所有平台上都使用 Windows 的 minidump 文件,而不是传统的 core 文件,出于如下一些原因:

  • Core 文件可能非常大,使它们无法通过网络发送到收集器进行处理。Minidumps 更小,因为它们本来就是设计来这样用的。

  • Core 文件格式的文档记录很差。比如 Linux Standards Base 没有描述在 PT_NOTE 段中寄存器是如何存储的。

  • 让 Windows 机器生成 core dump 文件比让其它机器写 minidump 文件更难。

  • 只支持一种文件格式简化了 Breakpad 处理器。

minidump 概述/生命周期

minidump 通过调用 Breakpad 库生成。默认情况下,初始化 Breakpad 安装一个异常/信号处理器,它在发生异常时把 minidump 写入磁盘。在 Windows 上,这通过 SetUnhandledExceptionFilter() 完成;在 OS X 上,这通过创建一个线程等待在 Mach 异常端口上来完成;而在 Linux 上,这通过为各种各样的异常,比如 SIGILLSIGSEGV 等安装信号处理器来完成。

一旦生成了 minidump,每个平台都有略微不同的方式来上传崩溃转储。在 Windows 和 Linux 上,提供了一个单独的函数库,可以调用它来执行上传。在 OS X 上,会生成一个单独的进程,提示用户授予权限(如果配置为这样做)并发送文件。

术语

进程内 vs 进程外异常处理 - 通常认为在崩溃的进程内写入 minidump 是不安全的 - 关键的进程数据结构可能已经被破坏,或者异常处理器所运行的栈可能已经被覆写,等等。所有 3 个平台都支持所谓的 “进程外” 异常处理。

集成概述

Breakpad 代码概述

所有的客户端代码可以通过访问位于 https://chromium.googlesource.com/breakpad/breakpad 的 Google Project 找到。src 目录具有如下的目录结构:

  • processor 包含 minidump 处理的代码,它们用在服务端,而不是用在客户端。

  • client 包含所有平台的客户端 minidump 生成库

  • tools 包含在各个平台上构建各种工具的源码和工程。

(在其他目录中)

构建过程细节(符号生成)

这适用于所有平台。src/tools/{platform}/dump_syms 内有一个工具,它可以读取各个平台的调试信息 (比如 OS X/Linux 的 DWARF 和 STABS,和 Windows 的 PDB 文件),并生成一个 Breakpad 符号文件。这个工具应该针对你 strip 之前的二进制文件运行(在 OS X/Linux 的情况下),且符号文件需要存储在某个 minidump 处理器可以找到的地方。还有另一个工具,symupload,如果你已经编写了一个可以接收它们的服务器,则可以用来上传符号文件。

参考文档

Getting started with breakpad

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容