项目地址:https://code.google.com/p/google-breakpad/    访问不了请挂VPN

这是一个由google主导的开源项目,官方介绍为:An open-source multi-platform crash reporting system,即 开源的多平台崩溃上报系统。
这是由google员工在工作中那20%的自由创造时间创造的作品,真正对技术热爱的人才会在自由时间改变世界,只完成工作的人永远只能做一把被人用完就丢的枪。

言归正传,google breakpad 支持iOS linux windows,
linux的崩溃捕获机制我比较熟悉,做好信号处理已经能搞定一大半了;
但是我对windows的崩溃捕获机制仅限于SEH,SEH无法满足所有场景的崩溃捕获(当然google breakpad也不能满足所有场景),
所以本文主要描述在windows平台上如何使用google breakpad捕获崩溃。

源码下载:
使用svn下载即可,不会可以点右上角的红X。

源码结构:主要在src的目录下
build:    编译脚本
client:主要包括捕获以及dump代码
common:通用支持代码
google_breakpad:breakpad使用的公共支持代码
processor:崩溃处理核心代码
testing:测试代码
third_party:第三方支持库
tools:一些小工具,用于处理dump文件和符号表

支持的捕获方式:
在exception_handler.h文件中可以看到以下定义:

  1. enum HandlerType {
  2. HANDLER_NONE = 0,
  3. HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter
  4. HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler
  5. HANDLER_PURECALL = 1 << 2, // _set_purecall_handler
  6. HANDLER_ALL = HANDLER_EXCEPTION |
  7. HANDLER_INVALID_PARAMETER |
  8. HANDLER_PURECALL
  9. };

也就是有这3种捕获方式:
1.HANDLER_EXCEPTION    -    即使用 SetUnhandledExceptionFilter 函数捕获,也就是大家熟知的SEH
2.HANDLER_INVALID_PARAMETER    -    使用 _set_purecall_handler 捕获纯虚函数导致的崩溃
3.HANDLER_PURECALL            -    使用 _set_invalid_parameter_handler 捕获错误参数调用导致的崩溃

google breakpad 是一套系统,支持dump文件的上传,上传是通过crash_report_sender完成的,协议使用http,Lib使用wininet,本文只做比较基础的本地dump用法演示,
整套c/s架构演示待我有时间后添加吧。

google breakpad 支持进程内捕获、进程外捕获,各有优劣:
进程外捕获:
    不会被崩溃进程自身影响,dump过程比较不易出现缺失信息、出错等问题;
    但是堆栈溢出有可能抓不到,死锁处理不了(这也不是崩溃)。

进程内捕获:
    有可能影响到自身的dump过程。

这玩意的选择自己看着办吧,我这里主要演示如何进程内捕获。

如何使用:
先简单看看代码调用方法,其实很简单,就是声明一个ExceptionHandler对象,ExceptionHandler构造函数如下:

  1. ExceptionHandler(const wstring& dump_path, //dump文件存储路径
  2. FilterCallback filter, //在写minidump之前调用,根据返回值决定是否dump
  3. MinidumpCallback callback, //写入minidump后调用
  4. void* callback_context, //上下文,不需要就NULL
  5. int handler_types); //指定需要安装的handle类型, 一般 ExceptionHandler::HANDLER_ALL 搞定
  6.  
  7. ExceptionHandler(const wstring& dump_path,
  8. FilterCallback filter,
  9. MinidumpCallback callback,
  10. void* callback_context,
  11. int handler_types,
  12. MINIDUMP_TYPE dump_type, //MINIDUMP_TYPE类型
  13. const wchar_t* pipe_name, //管道名,用于进程外捕获时的进程间通信
  14. const CustomClientInfo* custom_info); //客户端信息
  15.  
  16. ExceptionHandler(const wstring& dump_path,
  17. FilterCallback filter,
  18. MinidumpCallback callback,
  19. void* callback_context,
  20. int handler_types,
  21. MINIDUMP_TYPE dump_type,
  22. HANDLE pipe_handle,
  23. const CustomClientInfo* custom_info);
  24.  
  25. ExceptionHandler(const wstring& dump_path,
  26. FilterCallback filter,
  27. MinidumpCallback callback,
  28. void* callback_context,
  29. int handler_types,
  30. CrashGenerationClient* crash_generation_client);

在windows平台编译安装:
环境:win8 + vs2010

1.下载源文件
2.生成工程:
(1)安装python2.7,讲python2.7的安装目录设置到环境变量的path中,cmd中输入python能调用到python就算成功了
(2)打开一个cmd,进入google_breakpad目录
(3)    set GYP_MSVS_VERSION=2010
        src\tools\gyp\gyp.bat --no-circular-check src\client\windows\breakpad_client.gyp
(4)sln文件会生成到src\client\windows目录
(5)使用sln编译,lib文件会生成到google_breakpad\src\client\windows\debug or release目录中
友情提示:项目默认是编译mt的,可以自己根据需求修改

以下开始真正的调用方法:

  1. //一些需要的头文件
  2. #include <windows.h>
  3. #include <tchar.h>
  4.  
  5. #include "google_breakpad/client/windows/crash_generation/client_info.h"
  6. #include "google_breakpad/client/windows/crash_generation/crash_generation_server.h"
  7. #include "google_breakpad/client/windows/handler/exception_handler.h"
  8. #include "google_breakpad/client/windows/common/ipc_protocol.h"
  9.  
  10. //库
  11. #pragma comment(lib, "exception_handler.lib")
  12. #pragma comment(lib, "common.lib")
  13. #pragma comment(lib, "crash_generation_client.lib")
  14. #pragma comment(lib, "crash_generation_server.lib")
  15.  
  16. //定义静态的对象
  17. using namespace google_breakpad;
  18. static ExceptionHandler* handler = NULL;

实现dump后处理函数:

  1. bool ShowDumpResults(const wchar_t* dump_path,
  2. const wchar_t* minidump_id,
  3. void* context,
  4. EXCEPTION_POINTERS* exinfo,
  5. MDRawAssertionInfo* assertion,
  6. bool succeeded)
  7. {
  8. //MessageBox(NULL, _T("aa"), _T("bb"), 0);
  9.  
  10. TCHAR* text = new TCHAR[1024];
  11. text[0] = _T('\0');
  12. int result = swprintf_s(text,
  13. 1024,
  14. TEXT("Dump generation request %s\r\n"),
  15. succeeded ? TEXT("succeeded") : TEXT("failed"));
  16. if (result == -1) {
  17. delete [] text;
  18. }
  19.  
  20. return succeeded;
  21. }

在_tWinMain中创建对象:

  1. wstring wszDumpSavePath = L"F:\\dumptest\\"; //保存dump文件的路径,可以动态获取自身的路径
  2. handler = new ExceptionHandler(wszDumpSavePath.c_str(),
  3. NULL,
  4. ShowDumpResults,
  5. NULL,
  6. ExceptionHandler::HANDLER_ALL);

然后就OK了,在程序中人为制造一些崩溃问题,执行程序后,dmp文件就会保存到你设置的路径了。

如何查看dmp信息:
将dmp+exe+pdb文件放到同一目录下,双击dmp文件(用vs打开),即可查看dmp信息。

google breakpad 使用初步总结的更多相关文章

  1. C++库(Google Breakpad)

    Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...

  2. Android使用google breakpad捕获分析native cash

    Android 开发高手课 课后练习(1) 一.Chapter01 崩溃 https://time.geekbang.org/column/article/70602 https://github.c ...

  3. QT中使用google breakpad捕获程序崩溃异常

    今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...

  4. Google BreakPad使用集

    Google Breakpad 学习笔记 - 简书   Qt中使用Google Breakpad捕获程序崩溃异常_Linux编程_Linux公社-Linux系统门户网站 

  5. 房产地图google map的初步应用点滴.4)(转)

    房产地图google map的初步应用点滴.1) 房产地图google map的初步应用点滴.2) 房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) ...

  6. 房产地图google map的初步应用点滴.3)(转)

    房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) go ...

  7. 房产地图google map的初步应用点滴.2)(转)

    房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 本来 ...

  8. 房产地图google map的初步应用点滴.1)(转)

    房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 以前 ...

  9. Google Breakpad 完全解析(二) —— Windows前台实现篇

    原创文章,转载请标明出处:Soul Apogee (http://bigasp.com),谢谢. 好,看完了如何使用breakpad,我们现在看看breakpad在Windows下到底是如何实现的呢? ...

随机推荐

  1. InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts

    在一台server中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用. 之前执行一直没有问题(最多的时候有23个MySQL实例同一时候执行).后来新配置了一台server ...

  2. MYSQL 增加字段不报错,插入数据不报错处理

    ') ON DUPLICATE KEY UPDATE sort_name = "vipset"; 重点在 ON DUPLICATE KEY UPDATE sort_name = & ...

  3. 升级iOS 9之前的注意事项

    iOS 9 beta刚刚公布.就下载了官网的升级包, 使用itunes的更新功能,升级 眼看安装过程一番顺利, 升级完開始进入设置操作步骤上, 结果傻眼了 进入了输入手机password的界面,  不 ...

  4. Oracle学习(18)【DBA向】:分布式数据库

    分布式数据库 什么是分布数据库? l数据物理上被存放在网络的多个节点上,逻辑上是一个总体. 分布式数据库的独立性 l分布数据的独立性指用户不必关心数据怎样切割和存储,仅仅需关心他须要什么数据. Ora ...

  5. windows下使用mingw和msys编译GOTOBLAS和OpenBLAS

    在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...

  6. OpenTK的glutBitmapCharacter的替代方法

    由于openTK并没有打包集成GLUT,字体显示就成了一个问题. 办法1:采用QuickFont 优点:可以使用系统自带的字体 缺点:代码尚未成熟.只能2D显示,无法随物体旋转.平移 办法2:同时调用 ...

  7. windows内存管理的机制以及优缺点

    分页存储管理基本思想:用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等.可将用户程序的任一页放在内存的任一块中,实现了离散分配. 分段存储管 ...

  8. java反射(2)+Class.forName( )

    在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢? 其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映 ...

  9. 第一个WordCount类运行

    import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache. ...

  10. SSH无密码验证可能出现的问题

    雪影工作室版权所有,转载请注明[http://blog.csdn.net/lina791211] 一.安装和启动SSH协议 假设没有安装ssh和rsync,可以通过下面命令进行安装. sudo apt ...