google breakpad 使用初步总结

项目地址: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"
#include "google_breakpad/client/windows/tests/crash_generation_app/abstract_class.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信息。

时间: 2024-08-30 03:07:28

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

x86 Android游戏开发专题篇之使用google breakpad捕捉c++崩溃(以cocos2dx为例)

最近一直都在x86设备上进行游戏开发,就c++层和Android java层倒没有什么要特别注意的(除了需要注意一下修改Application.mk指定平台外),在c++崩溃的时候,很多时候看不到堆栈,只能看到一个信号,所以由于工作需要,使用google breakpad来进行异常捕捉. 谷歌被墙很麻烦,索性就把breakpad打包放这里供需要的童鞋下载,google breakpad下载. 1.下载google breakpad 下载地址是  http://code.google.com/p/

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

房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 本来是想将房产地图google map的应用记录一个系列,但继1)记录完之后总找不到时间继续记录下去,1)中主要解决了Google Maps JavaScript API V3 与 Google Local Search API两者由于版本问题带来的一系列麻烦,思路是使用一个iframe作为兼容的跳板,

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

房产地图google map的初步应用点滴.1) 房产地图google map的初步应用点滴.2) 房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) google map测距的实现和分析 不断有传闻google map在今年的7月1号之后在大陆停止运营,具体原因是因为天朝的牌照问题,这个就不多讲了,可以发现现在搜房网的地图,和安居客等的地图纷纷都撤下 google map,而重新选择了mapabc或baidu,当然网易房产地图也不例外,现在也在使

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

房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) google Map的交互基本都是事件驱动的,这表示js是通过生成时间来响应交互的,并且处于监听我们设定的事件,每个 Google Maps API 对象都可导出大量已命名的事件.如果程序想要实现某些事件,则会为这些事件注册 Javascript 事件侦听器,并会在通过在 google.maps.eve

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

房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 以前的房产地图一直都是使用有道地图,虽然有道地图是很好,但是为了更好,还是决定使用google地图来重新开发^_^,下面是一个开发完毕的简单应用http://xf.house.163.com/gz/map/000B.html 1)整合Google Maps JavaScript API V3 与 Goo

Netty学习——Google Protobuf的初步了解

学习参考的官网: https://developers.google.com/protocol-buffers/docs/javatutorial 简单指南详解:这个文档写的简直是太详细了. 本篇从下面三个步骤进行介绍: I. Define message formats in a .proto file. II. Use the protocol buffer compiler. III. Use the Java protocol buffer API to write and read m

【转】Android Google Map API使用的八个步骤

Android Google Map API使用的八个步骤 本系列教程将分为两部分,第一部分是指导用户使用Mapview控件进行编程,其中包括了如何获得Google Map API,如何使用该API进行简单的开发,如何获得用户当前所在的位置.第二部分则包括如何在地图上,用第三方的组件库,实现气球式显示若干指定位置的功能. 步骤1 创建新的Android 工程 首先打开eclipse新建立一个Android 工程,其中相关参数设置如下: Project name:MallFinder Build 

google的开源c++

代码风格指南 http://code.google.com/p/google-styleguide/通过这个了解代码规范和编写新代码 Open Source Projects Released By Google http://code.google.com/intl/zh-CN/opensource/projects.html google的完整开源例子 https://developers.google.com/ http://code.google.com/intl/zh-CN/opens

谷歌Cartographer学习(2)-原理阐述与源码解析

最近终于写完了毕业论文.想仔细研究下Cartographer.无奈自己学识有限,先看下网上大牛的解析,作一个汇总. 一.泡泡机器人原创专栏-cartographer理论及实践浅析 http://mp.weixin.qq.com/s/LdbFp-Zvkr02-_25ILb16g 二.[SLAM](一)Google Cartographer的初步尝试 三.kint_zhao的博客:http://blog.csdn.net/zyh821351004/article/details/52421005 四