在编译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中点击调试
准确定位崩溃位置