项目地址: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. React Native入门——布局实践:开发京东client首页(一)

    有了一些对React Native开发的简单了解,让我们从实战出发.一起来构建一个简单的京东client. 这个client是仿照之前版本号的京东client开发的Android版应用,来源于CSDN ...

  2. 一个有意思的Ruby Webdriver超时问题的解决过程

    rescue in receive 由于写ruby的时候感觉混身上下都拽起来了,所以比較喜欢用ruby写代码. 今天遇到了一个webdriver timeout的问题,问题本身还是由于我对webdri ...

  3. ARGB,RGB颜色值表示

    转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50831493 今天自己定义一个控件.设置背景颜色时犯难了 如今就来总结一下 ...

  4. 微博试水卖车社交电商怎样令4S“颤抖”?

        微博对社交电商的探索一直在深入,年初.微博上线了"支付"产品.从而使社交产业链实现了闭环,随后,微博又尝试售卖多种商品,不断扩大移动电商的试水范围,近期微博大规模汽车销售收 ...

  5. 百度接口通过ip获取用户所在地

    /** * 百度接口      * 通过用户ip获取用户所在地      * @param userIp      * @return      */ public static String get ...

  6. sublime text 3 乱码

    sublime text 是一款很好用的文字编辑软件,可谓是程序员必备,但是最近发现在mac端使用的时候,中文乱码, 网上一些解决方案,抄袭严重,没有解决实际问题,所以记录下自己解决问题的过程. 1. ...

  7. BZOJ 2460: [BeiJing2011]元素 线性基

    2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...

  8. jetty9 web app的部署

    jetty9将web app和web app的context配置文件都放在${JETTY_HOME}/webapps下面. 例如,如果有一个myapp.war,首先将其放入${JETTY_HOME}/ ...

  9. java语法基础(四)

    继承 继承概述 继承是面向对象语言的三大基本特性(封装,继承,多态)之一. 一个类可以继承另外一个类,继承的类称为子类(也可以叫派生类),被继承的类称为父类(或者也叫基类,超类). 通过继承,子类可以 ...

  10. mysql 转换编码方式

    进入mysql 的安装文件夹找到 “ my.ini” 文件  (mysql配置文件) 一.编辑MySql的配置文件 vim /etc/my.cnf 在 [mysqld] 标签下加上三行 default ...