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(这个网站需要翻墙,所以还是去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)——起步的更多相关文章
- SpringBoot系列教程起步
本篇学习目标 Spring Boot是什么? 构建Spring Boot应用程序 三分钟开发SpringBoot应用程序 本章源码下载 Spring Boot是什么? spring Boot是由Piv ...
- breakpad系列(2)——在Linux中使用breakpad
本文来自breakpad源码目录中doc目录下的linux_starter_guide.md,建议直接去看原文. 如何将breakpad添加进你的Linux程序 本文档是在Linux上使用Breakp ...
- Apache Kafka系列(一) 起步
Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...
- Java工程师之SpringBoot系列教程前言&目录
前言 与时俱进是每一个程序员都应该有的意识,当一个Java程序员在当代步遍布的时候,你就行该想到我能多学点什么.可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代.但 ...
- 《VTL语法参考指南》中文版[转]
转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607935.aspx <VTL语法参考指南>中文版 源文见 http://ve ...
- 《Velocity 模板使用指南》中文版[转]
转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607931.aspx <Velocity 模板使用指南>中文版 源文见 htt ...
- 《C语言及程序设计初步》网络课程主页
题记 CSDN要开在线教育频道,向我发出邀请,看能否开些课程. 我近日一直在关注着翻转课堂,试图在传统课堂中引入新的元素,这须要资源建设的积累.没有时间表的工作,非常难把握. 为CSDN做在线课程,为 ...
- Vue系列(一):简介、起步、常用指令、事件和属性、模板、过滤器
一. Vue.js简介 1. Vue.js是什么 Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e 是一个轻量级MVVM(Model-View-ViewModel)框架,和 ...
- react实战系列 —— 起步(mockjs、第一个模块、docusaurus)
其他章节请看: react实战 系列 起步 本篇我们首先引入 mockjs ,然后进入 spug 系统,接着模仿"任务计划"模块实现一个类似的一级导航页面("My任务计划 ...
随机推荐
- ubuntu ARM 源配置
cat /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main deb-src http://mir ...
- CentOS 安装、配置Nginx反向代理
安装: yum install epel-release yum install nginx 配置: [root@bogon ~]# vim /etc/nginx/conf.d/default.con ...
- 【python系统学习17】python中的文件读写
python中的文件读写 文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本.音频片段.Excel文档.邮件以及任何保存在电脑上的东西. 可使用python批量的操作本地文件, ...
- 调试 Ingress Nginx
由于 Ingress Nginx 是最受欢迎的 Ingress 控制器,因此接下来我们将介绍一些有关调试 ingress-nginx 的技巧. 调试 Ingress Nginx Ingress-ngi ...
- antd-vue中table行高亮效果实现
[方式一]:通过设置customRow达到目的,点击时遍历所有行设置为正常颜色,把当前行设置为特殊颜色(高亮色) HTML: <a-table ref="table" siz ...
- centos 7 对用过yum更新的软件服务进行降级
centos 7 执行 yum update 会对现有服务软件进行更新,但是如果把不该升级的软件升级,彼此软件不兼容,如何进行降级,比如:kibana 必须与 elasticsearch 大版本相同, ...
- WebRTC的VAD 过程解读
摘要: 在上一篇的文档中,分析unimrcp中vad算法的诸多弊端,但是有没有一种更好的算法来取代呢.目前有两种方式 1. GMM 2. DNN. 其中鼎鼎大名的WebRTC VAD就是采用了GM ...
- ArcGIS Pro 二次开发
本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5.22081 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装V ...
- 高可用集群corosync+pacemaker之crmsh使用(二)
上一篇博客我们聊到了crmsh的安装以及配置一个资源到corosync+pacemaker高可用集群上的相关命令的用法,回顾请参考https://www.cnblogs.com/qiuhom-1874 ...
- Fragment 1.2.0 更新记录
1.官方地址 https://developer.android.com/jetpack/androidx/releases/fragment 2.引入方法 dependencies { def fr ...