原文来自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(这个网站需要翻墙,所以还是去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”可用于上传符号文件。

breakpad系列(1)——起步的更多相关文章

  1. SpringBoot系列教程起步

    本篇学习目标 Spring Boot是什么? 构建Spring Boot应用程序 三分钟开发SpringBoot应用程序 本章源码下载 Spring Boot是什么? spring Boot是由Piv ...

  2. breakpad系列(2)——在Linux中使用breakpad

    本文来自breakpad源码目录中doc目录下的linux_starter_guide.md,建议直接去看原文. 如何将breakpad添加进你的Linux程序 本文档是在Linux上使用Breakp ...

  3. Apache Kafka系列(一) 起步

    Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...

  4. Java工程师之SpringBoot系列教程前言&目录

    前言 与时俱进是每一个程序员都应该有的意识,当一个Java程序员在当代步遍布的时候,你就行该想到我能多学点什么.可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代.但 ...

  5. 《VTL语法参考指南》中文版[转]

    转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607935.aspx <VTL语法参考指南>中文版 源文见 http://ve ...

  6. 《Velocity 模板使用指南》中文版[转]

    转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607931.aspx <Velocity 模板使用指南>中文版 源文见 htt ...

  7. 《C语言及程序设计初步》网络课程主页

    题记 CSDN要开在线教育频道,向我发出邀请,看能否开些课程. 我近日一直在关注着翻转课堂,试图在传统课堂中引入新的元素,这须要资源建设的积累.没有时间表的工作,非常难把握. 为CSDN做在线课程,为 ...

  8. Vue系列(一):简介、起步、常用指令、事件和属性、模板、过滤器

    一. Vue.js简介 1. Vue.js是什么 Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e 是一个轻量级MVVM(Model-View-ViewModel)框架,和 ...

  9. react实战系列 —— 起步(mockjs、第一个模块、docusaurus)

    其他章节请看: react实战 系列 起步 本篇我们首先引入 mockjs ,然后进入 spug 系统,接着模仿"任务计划"模块实现一个类似的一级导航页面("My任务计划 ...

随机推荐

  1. 第2章 RDD编程(2.3)

    第2章 RDD编程(2.3) 2.3 TransFormation 基本RDD Pair类型RDD (伪集合操作  交.并.补.笛卡尔积都支持) 2.3.1 map(func) 返回一个新的RDD,该 ...

  2. Vscode配置C++环境

    (终于申请博客了qaq) 之前用了那么久Dev-C++,总算换了一个编辑器,Visual Studio Code (Vscode). 界面可比以前的舒适多了. Vscode作为一款功能极其丰富的开发工 ...

  3. 快速排序算法简述及python的实现

    def kp(arr, i, j): if i<j: #i=j时意味着一边只剩单个数据 base = kpgc(arr, i, j) kp(arr, i, base-1) #kp(arr, i, ...

  4. 第1篇 Scrum冲刺博客

    一.Alpha阶段各成员任务 梁天龙 任务名称 预计工时  编辑历史记录  2  登陆按键设计  3  考勤记录页面 2  人数记录页面  2  学习课程页面 4  建议页面  2 黄岳康 任务名称 ...

  5. Java多线程_ReentrantLock

    ReentrantLock是重入锁,它与synchronized很像,它是synchronized的加强版,因为它具有一些synchronized没有的功能.下面我们看看两者的区别:synchroni ...

  6. PHP学习中的一些总结(持续更新)

    文件上传部分 在前台的<form>表单中 hidden隐藏域的MAX_FILE_SIZE可以起到实质性的控制作用,即在文件上传之前就可以判断文件的大小,格式为: <form acti ...

  7. Linux两台服务器mysql数据库同步

    我们在做web系统部署的时候往往涉及到两台甚至多台数据库的备份,为了数据安全考虑(虽然说到底不过是一堆0 1,但是价值千金啊),所以我们还是乖乖做同步把! 1.准备两台Linux服务器(主.从) 2. ...

  8. nodejs打包成桌面程序(exe)的进阶之路

    nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...

  9. 设计模式C++模板(Template)模式

    设计模式C++描述----02.模板(Template)模式(转载) 一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现, ...

  10. linux网络配置及虚拟机连接不上网排错思路

    第1章          操作系统与虚拟软件的使用 1.1  虚拟软件使用方法 Vmware 1.1.1  开启vmware 注: 同时只能开启一个VMware软件,如果开了两个VMware窗口 提示 ...