> 文章列表 > breakpad编译指南(Windows)

breakpad编译指南(Windows)

breakpad编译指南(Windows)

在编译breakpad时候,遇到各种各样的问题,做些记录,以便后续参考

Windows下已有SetUnhandledExceptionFilter可以抓取dmp,为什么还要研究breakpad?因为breakpad是跨平台的,相关资料参考如下:

02-跨平台的Qt程序崩溃之前生成Dump文件Breakpad_qbreakpad和google breakpad的区别_robert_cysy的博客-CSDN博客

Windows下编译

安装python,我本地安装的python2.7(其他版本可能会有报错),参考安装方法:

Python2.7 安装教程_枫之星雨的博客-CSDN博客

(注:安装参考文档中设置环境变量只添加的C:\\Python27,尽量把C:\\Python27\\Scripts也加入到环境变量中)

breakpad源码下载 

git clone https://chromium.googlesource.com/breakpad/breakpad

获取gyp(chromium开发的跨平台自动化项目构建工具)

git clone https://chromium.googlesource.com/external/gyp

安装gyp

cd gyp
python setup.py install

然后gyp -h 验证是否安装成功

可能会报错

 这个是缺少six模块,可执行

pip install six

然后再次执行gyp -h 验证是否安装成功,如下截图说明成功了

然后可以使用 gyp生成sln

1、需要注意的是,克隆的breakpad源码需要切换到master分支,不然是没有breakpad_client.gyp文件的

2、执行命令

./gyp.bat --no-circular-check "../breakpad/src/client/windows/breakpad_client.gyp"

注意:网上几乎所有博客该命令开头都没有./   我这里报错“gyp.bat : 无法将“gyp.bat”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”如下图

 正确执行如下图:

最后查看breakpad\\src\\client\\windows路径下有sln文件生成了

 

 vs打开编译即可(vs版本过高的话,需要按照提示升级项目)

 红框中的三个项目由于生成sln时候报错,缺少文件,所以这三个编译会失败,但不影响整体,可以忽略

接下来就可以使用生成的文件了

新建一个项目test_breakpad

#include <iostream>
#include <cstdio> 
#include "client/windows/handler/exception_handler.h"  namespace {static bool callback(const wchar_t* dump_path, const wchar_t* id,void* context, EXCEPTION_POINTERS* exinfo,MDRawAssertionInfo* assertion,bool succeeded) {if (succeeded) {printf("dump guid is %ws\\n", id);}else {printf("dump failed\\n");}fflush(stdout);return succeeded;}static void CrashFunction() {int* i = reinterpret_cast<int*>(0x45);*i = 5;  // crash!  }}  // namespace  int main()
{google_breakpad::ExceptionHandler eh(L".", NULL, callback, NULL,google_breakpad::ExceptionHandler::HANDLER_ALL);CrashFunction();printf("did not crash?\\n");return 0;
}

将头文件拷贝到测试项目下面

然后拷贝配置lib(配置方法可在网上参考)

common.lib 
exception_handler.lib 
crash_generation_server.lib 
crash_generation_client.lib

如果报错

需要将如下图和breakpad中的设置一样

 

运行测试程序,生成dmp

dmp拖入vs中点击调试

准确定位崩溃位置