项目地址: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文件中可以看到以下定义:

  enum HandlerType {
HANDLER_NONE = 0,
HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter
HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler
HANDLER_PURECALL = 1 << 2, // _set_purecall_handler
HANDLER_ALL = HANDLER_EXCEPTION |
HANDLER_INVALID_PARAMETER |
HANDLER_PURECALL
};

也就是有这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构造函数如下:

ExceptionHandler(const wstring& dump_path,        //dump文件存储路径
FilterCallback filter, //在写minidump之前调用,根据返回值决定是否dump
MinidumpCallback callback, //写入minidump后调用
void* callback_context, //上下文,不需要就NULL
int handler_types); //指定需要安装的handle类型, 一般 ExceptionHandler::HANDLER_ALL 搞定 ExceptionHandler(const wstring& dump_path,
FilterCallback filter,
MinidumpCallback callback,
void* callback_context,
int handler_types,
MINIDUMP_TYPE dump_type, //MINIDUMP_TYPE类型
const wchar_t* pipe_name, //管道名,用于进程外捕获时的进程间通信
const CustomClientInfo* custom_info); //客户端信息 ExceptionHandler(const wstring& dump_path,
FilterCallback filter,
MinidumpCallback callback,
void* callback_context,
int handler_types,
MINIDUMP_TYPE dump_type,
HANDLE pipe_handle,
const CustomClientInfo* custom_info); ExceptionHandler(const wstring& dump_path,
FilterCallback filter,
MinidumpCallback callback,
void* callback_context,
int handler_types,
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的,可以自己根据需求修改

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

//一些需要的头文件
#include <windows.h>
#include <tchar.h> #include "google_breakpad/client/windows/crash_generation/client_info.h"
#include "google_breakpad/client/windows/crash_generation/crash_generation_server.h"
#include "google_breakpad/client/windows/handler/exception_handler.h"
#include "google_breakpad/client/windows/common/ipc_protocol.h" //库
#pragma comment(lib, "exception_handler.lib")
#pragma comment(lib, "common.lib")
#pragma comment(lib, "crash_generation_client.lib")
#pragma comment(lib, "crash_generation_server.lib") //定义静态的对象
using namespace google_breakpad;
static ExceptionHandler* handler = NULL;

实现dump后处理函数:

bool ShowDumpResults(const wchar_t* dump_path,
const wchar_t* minidump_id,
void* context,
EXCEPTION_POINTERS* exinfo,
MDRawAssertionInfo* assertion,
bool succeeded)
{
//MessageBox(NULL, _T("aa"), _T("bb"), 0); TCHAR* text = new TCHAR[1024];
text[0] = _T('\0');
int result = swprintf_s(text,
1024,
TEXT("Dump generation request %s\r\n"),
succeeded ? TEXT("succeeded") : TEXT("failed"));
if (result == -1) {
delete [] text;
} return succeeded;
}

在_tWinMain中创建对象:

wstring wszDumpSavePath = L"F:\\dumptest\\";                //保存dump文件的路径,可以动态获取自身的路径
handler = new ExceptionHandler(wszDumpSavePath.c_str(),
NULL,
ShowDumpResults,
NULL,
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. C实现头插法和尾插法来构建单链表(不带头结点)

    链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点. ...

  2. Ubuntu16.04下安装Tensorflow CPU版本(图文详解)

    不多说,直接上干货! 推荐 全网最详细的基于Ubuntu14.04/16.04 + Anaconda2 / Anaconda3 + Python2.7/3.4/3.5/3.6安装Tensorflow详 ...

  3. cmd下复制粘贴

    cmd下复制粘贴的快捷操作方式 工具/原料 系统cmd 步骤/方法 1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框 ...

  4. 2016/04/26 权限 数据库mydb2 五个表 分别是 1,用户 2,角色 3,权限 4,用户对应的角色 5,角色对应的权限

    权限:   1,后台分配角色     角色对应权限    2,各用户通过登录页面登录    查看到各自的权限 五个页面   加引入一个jquery-1.11.2.min.js 1,guanli.php ...

  5. 2016/4/2 json:js和jquery中轻量级数据交换格式 例: 窗口弹出 popwindow

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  6. javaScript改变HTML

    改变HTML输出流: 在JavaScript中,document.write() 可用于直接向HTML输出流写内容 <!DOCTYPE html> <html> <bod ...

  7. 基于TCP的字符串传输程序

    ---恢复内容开始--- LINUX中的网络编程是通过SOCKET接口来进行的. Socket(套接字) Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接 ...

  8. Java Socket通信读取相关信息代码

    转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...

  9. node 中mongoose使用validate和密码加密的问题

    在今天一直被一个问题困扰,就算是使用mongoose的alidate的时候想要限制密码的位数,比如不能少于几位,但是一直出错. 最后发现原来使用validate的时候,是在数据将要存入数据库的时候,因 ...

  10. PostgreSQL完整备份与还原过程

    1. 备份10.12.2.100PC机(服务器)上的数据库(仅备份数据库和对应的数据库里面各表的结构): pg_dump -h 10.12.2.100 -U postgres -p 8101 -d t ...