原文来自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. linux 修改 mac

    ifconfig eth0 hw ether fa::3d:c3:: 或 ip link set dev eth0 address fa::3d:c3::

  2. Docker 学习笔记(一)

    Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...

  3. C#串口通讯,复制粘贴就可用,仅仅介绍怎样最快的搭建一个串口通讯,异常拦截等等需要自己加上

    using System; using System.Collections.Generic; using System.IO.Ports; using System.Text; //串口通讯类 pu ...

  4. JdbcTemplate jar包 下载

    我给了一个链接, 是jar download网站上的. 能上去的就可以下载. https://jar-download.com/maven-repository-class-search.php?se ...

  5. VS2015+opencv3.1.0 imshow()函数出现中文乱码----问题一

    Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2015中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...

  6. 【Flutter 实战】17篇动画系列文章带你走进自定义动画

    老孟导读:Flutter 动画系列文章分为三部分:基础原理和核心概念.系统动画组件.8篇自定义动画案例,共17篇. 动画核心概念 在开发App的过程中,自定义动画必不可少,Flutter 中想要自定义 ...

  7. android开发之java代码中如何获取到当前时间。详情代码带注释。

    /** *获取当前时间 * @return */ public String getTime(){ Date date= new Date();//创建一个时间对象,获取到当前的时间 SimpleDa ...

  8. 【转】对初学LoadRunner朋友的建议

    对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...

  9. java基础(swing+jsp+mybatis配置)

    JAVA SE GUI编程(swing) # 组件 描述 1 JFrame 一个普通的窗口(绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器) 2 JDialog 对话框 常用的中间 ...

  10. centos开放指定端口

    1.开启防火墙      systemctl start firewalld 2.开放指定端口       firewall-cmd --zone=public --add-port=1935/tcp ...