C/C++程序最棘手的时候就是一个字“挂”,总是经常和不经常的挂掉,尤其是那些线上的不经常挂的情况,光看日志定位问题真的很难。
为解决C挂挂的问题,有必要提供一个跨平台的crash处理系统,目前已知的支持平台有windows 、Linux、 OS X 、android、等待。
下面就来看看Google自己用的系统:Breakpad
最好的介绍莫过于谷歌自己的:
谷歌的介绍:http://code.google.com/p/google-breakpad/wiki/GettingStartedWithBreakpad
谷歌翻译-》本人修改版:(不一定准确)minidump-》小型转储
介绍
Breakpad是一个库和工具套件可以让你发布的应用程序(把编译器提供的调试信息剥离掉的)给用户,记录了崩溃紧凑的“dump”文件,发送回您的服务器,并从这些minidump产生C和C++堆栈踪迹。Breakpad可以根据请求使没有崩溃的程序也可以写出minidump。
目前使用Breakpad的有谷歌浏览器,火狐,谷歌的Picasa,卡米诺,谷歌地球,和其他项目。
Breakpad有三个主要组件:
- 客户端是一个库,包含在您的应用程序中。 它可以获取当前线程的状态和当前加载的可执行文件和共享库的ID写转储文件。您可以配置客户端发生了崩溃时写入一个minidump时,或明确要求时。
- 符号卸载器是一个程序,读取由编译器产生的调试信息,并生成一个使用Breakpad格式的符号文件 。
- 该处理器(minidump processor)是一个程序,读取一个minidump文件,找到相应的版本的符号文件的(可执行文件和共享库的转储提到的),并产生了一个人可读的C / C + +堆栈跟踪。
小型转储文件格式(即minidump)
转储文件的格式是由微软开发的类似存储的文件,崩溃便利上传。一个minidump文件包含:
- 在创建dump的进程中加载的可执行文件和共享库列表。此列表中包含的特定版本加载的那些文件的文件名和标识符。
- 在这个过程中存在的线程列表。对于每个线程转储包括处理器寄存器的状态,线程的堆栈存储器的内容。一般Breakpad客户端没有可用于产生函数名或行号,甚至确定堆栈帧的边界的调试信息,所以这些数据是不可解释的字节流。
- 其他收集的有关系统转储信息比如:处理器和操作系统版本,转储的原因,等等。
Breakpad在所有平台上使用Windows dump文件,而不是传统的core文件,有以下几个原因:
- core文件可能会非常大,不适合在网络上发送给收集器处理。minidump较小,因此它们被设计为使用这种方式。
- core文件格式缺乏文档信息。例如,Linux标准库不描述寄存器如何存储在PT_NOTE段的。
- 一个Windows机器上生成一个core dump文件,比起其他机器上生成一个minidump文件,哪个难很难说。
- 简化了Breakpad处理器,只支持一种文件格式。
概述/一个小型转储的生命周期
通过调用到Breakpad库生成一个minidump。默认初始化Breakpad时,安装了一个异常/信号handler,崩溃时可写一个minidump到磁盘。在Windows上,这是通过SetUnhandledExceptionFilter()实现;在 OS X上,这是通过创建一个线程,等待的Mach exception端口,在Linux上,这是通过安装一个信号handler来应对程序的各种异常情况,如SIGILL,SIGSEGV等。
一旦生成minidump,每个平台都有一个略有不同的方式上传的崩溃dump。在Windows和Linux上,提供一个单独的函数库,可以被称为做upload。在OS X上,一个单独的进程产生,提示用户是否允许,如果同意这样做则发送文件。
术语
进程内与进程外的异常处理——进程内写minidump通常被认为是不安全的,关键处理数据结构可能已经被破坏,异常处理程序运行所处的堆栈或可能已经被覆盖,等等。所有3个平台都支持“进程外”异常处理。
集成概述
Breakpad代码概述
所有的客户端代码访问谷歌计划在http://code.google.com/p/google-breakpad 。 是在src目录下的以下目录结构:
- 处理器---包含转储处理的代码,它用于在服务器端,而不是在客户端上使用
- 客户端---包含适用于所有平台的客户端转储产生库
- 工具---包含源代码和项目,生成在每个平台上的各种工具。
(在其他目录)
- Windows Integration Guide Windows集成指南
- Mac Integration Guide Mac的集成指南
- Linux Integration Guide Linux集成指南
生成过程的详细资料(符号生成)
适用于所有平台。src/tools/{platform}/dump_syms是一个工具,可以读取每个平台的调试信息(例如,OS X / Linux操作系统,DWARF和STABS,以及Windows,PDB文件),和产生一个Breakpad的符号文件。应在二进制程序剥离符号之前(比如OS X/Linux)运行此工具,需要存储dump在处理器可以找到的地方。还有另一种工具,symupload,可以上传符号文件。如果你写了一个服务器,可以接收它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)