Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合。

三个主要组件

◆ client 以library的形式内置在你的应用中,当崩溃发生时写 minidump文件

◆ symbol dumper 读取由编译器生成的调试信息(debugging information),并生成 symbol file

◆ processor 读取 minidump文件 和 symbol file,生成可读的c/c++ Stack trace.

简单来说就是一个生成 minidump,一个生成symbol file,然后将其合并处理成可读的Stack trace。

MiniDump文件格式

minidump文件格式是由微软开发的用于崩溃上传,它包括:

◆当dump生成时进程中一系列executable和shared libraries, 包括这些文件的文件名和版本号。

◆进程中的线程列表,对于每个线程,minidump包含它在寄存器中的状态,线程的stack memory内容。这些数据都是未解析的字节流,Breakpad client通常没有调试信息(debugging information)能生成函数名,行号,甚至无法确定stack frame的边界。

◆其他收集关于系统的信息,如:处理器,操作系统高版本,dump的原因等等。

Breakpad在所有平台上(windows/linux等)都统一使用minidump文件格式,而不使用core files,原因是因为:

◆ core files可能很大,而minidump比较小。

◆ core files文档不全

◆ 很难说服windows机器去生成core files,但可以说服其他机器来生成minidump文件。

◆ breakpad只支持一种统一的格式会比较简单,而不是同时支持多种格式。

Symbols文件格式

symbols文件是基于纯文本的,每一行一条记录,每条记录中的字段以一个空格作为分隔符,每条记录的第一个字段表示这一行是什么类型的记录。

记录类型:

◆ 模块记录:MODULE operatingsystem architecture id name

◆ 文件记录:FILE number name

◆ 函数记录:FUNC address size parameter_size name

◆ 行号记录:address size line filenum

◆ PUBLIC记录:PUBLIC address parameter_size name

◆ STACK WIN

◆ STACK CFI

不同平台的实现原理

默认情况下,当崩溃时breakpad会生成一个minidump文件,在不同平台上的实现机制不一样:

◆在windows平台上,使用微软提供的 SetUnhandledExceptionFilter() 方法来实现。

◆在OS X平台上,通过创建一个线程来监听 Mach Exception port 来实现。

◆在Linux平台上,通过设置一个信号处理器来监听 SIGILL SIGSEGV 等异常信号。

当minidump被生成后,在不同平台上也使用不同的机制来上传crash dump文件。

异常处理机制

提供两种不同的异常处理机制:

◆ 同进程(in-process)

◆ 跨进程(out-precess)

因为在崩溃的进程写minidump文件是不安全的,所以三个平台(windows、linux、mac os)都提供跨进程的异常处理机制。

最新文章

  1. 学习javascript数据结构(一)——栈和队列
  2. 数据分析(7):pandas介绍和数据导入和导出
  3. Html中Table的简单使用
  4. 设计宝库:22套精美的 PhotoShop 素材免费下载
  5. hibernate简单注释(一)
  6. 10秒钟sublime text 3安装SVN插件
  7. 【转】Deprecated: Function ereg_replace() is deprecated的解决方法
  8. javascript_22_for_js控制div每五个换一行
  9. 【面试题003】c数组做为参数退化的问题,二维数组中的查找
  10. 小白日记21:kali渗透测试之提权(一)--本地提权
  11. openssl编译(VC6.0)
  12. CSDN博客投票活动开始了
  13. codeforces#1011C. Fly (二分,注意精度)
  14. 从字节码看java中 this 的隐式传参
  15. configure.*和Makefile.*之间的关系
  16. SQLSERVER 备份数据库的注意事项
  17. 使用 CXF 做 webservice 简单例子(转载)
  18. EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。上一计数 = 1,当前计数 = 2
  19. 《Linux内核分析》 第二节 操作系统是如何工作的
  20. Node.js之接收前台数据实例

热门文章

  1. Ambiguous mapping found. Cannot map 'competeController' bean method
  2. 深度解析HashMap底层实现架构
  3. C语言:获取汉字的编码
  4. 『与善仁』Appium基础 — 3、ADB命令介绍
  5. __schedule的一些小细节
  6. Linux从入门到进阶全集——【第十五集:安装apache服务器】
  7. static能修饰什么
  8. 简单快速安装Apache+PHP+MySql服务环境(四)—— 将php版本升级到7.2
  9. CentOS下 Django部署 uWSGI+Django(一)
  10. POJ1704 Georgia and Bob 题解