您现在的位置是:首页 >其他 >breakpad编译指南(Windows)网站首页其他

breakpad编译指南(Windows)

辛海峰 2023-06-05 20:00:02
简介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:Python27Scripts也加入到环境变量中)

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、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”如下图

 正确执行如下图:

最后查看breakpadsrcclientwindows路径下有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
", id);
        }
        else {
            printf("dump failed
");
        }
        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?
");
    return 0;
}

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

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

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

如果报错

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

 

运行测试程序,生成dmp

dmp拖入vs中点击调试

准确定位崩溃位置

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。