windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)

news2025/2/2 11:32:44

我们在刚开始项目开发时,经常会因为各种粗心造成各种各样的容易使项目运行时崩溃的代码,比如,给空指针的指向赋值。然而,当项目的文件数非常多时,想找到出错的代码的位置是费事而让人心烦的。crashpad就可以在项目运行崩溃的瞬间生成dump文件,Crashpad会将收集的崩溃信息和相关数据组织成一个崩溃报告,并将报告保存在本地dump文件中。使用vs打开dump文件,就可以看到造成崩溃的代码行和代码所在文件。

接下来详细介绍怎么使用crashpad来在项目运行崩溃时生成dmp文件。

1、首先,找到我们下载好的crashpad复制到项目的根目录下面,在vs2019中新建项目控制台应用程序CrashpadTest。如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、右击项目名,在弹出的窗口中选择最下面的属性,点击属性,会弹出属性页对话框。在属性页中,点击c/c++ -> 点击常规 -> 点击附加包含目录中点击右侧的下拉箭头 -> 点击编辑,会弹出附加包含目录对话框。

在这里插入图片描述

3、在弹出的附加包含目录进行如下操作。

在弹出的选择目录选项中找到项目的根目录,然后点击进入crashpad目录,选择include文件夹。点击确定,点击确定。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4、继续点击属性页的链接器 -> 输入 -> 附加依赖项右侧下拉按钮 -> 编辑,弹出附加依赖项对话框。输入:

crashpad/lib/debug/base.lib
crashpad/lib/debug/client.lib
crashpad/lib/debug/common.lib
crashpad/lib/debug/util.lib
在这里插入图片描述

注意:

1、要将下载好的crashpad放入项目的根目录下,然后才可以在附加依赖项输入上面的内容。对应的目录和lib文件如下。

在这里插入图片描述

2、因为创建的项目的目标平台是x64,所以下载的crashpad也应该是64位的。

在这里插入图片描述

因为创建的项目是debug模式,所以选择的是crashpad下的debug目录下的依赖库,如果创建的是release模式下项目,附加依赖项中应该写入以下内容:

crashpad/lib/base.lib
crashpad/lib/client.lib
crashpad/lib/common.lib
crashpad/lib/util.lib

对应的目录和lib文件如下:

在这里插入图片描述

5、点击应用。

在这里插入图片描述

6、在CrashpadTest.cpp中添加头文件,编写代码。

CrashpadTest.cpp 


#include <iostream>
#include "client/crash_report_database.h"
#include "client/crashpad_client.h"
#include "client/settings.h"

using namespace std;
using namespace crashpad;

std::wstring getExecutableDir()
{
    HMODULE hModule = GetModuleHandleW(NULL);
    WCHAR path[MAX_PATH];
    DWORD retVal = GetModuleFileNameW(hModule, path, MAX_PATH);
    if (retVal == 0)
    {
        return NULL;
    }
    else
    {
        wchar_t* lastBackslash = wcsrchr(path, '\\');
        if (lastBackslash == NULL)
        {
            return NULL;
        }
        else
        {
            *lastBackslash = 0;
        }
    }
    return std::wstring(path);
}

bool initializeCrashpad()
{
    using namespace crashpad;
    std::map<std::string, std::string> annotations;
    std::vector<std::string> arguments;

    //改为自己的crashpad_handler.exe 路径
    std::wstring appPath = getExecutableDir();
    std::wstring exePath = appPath + L"/crashpad_handler.exe";

    std::wstring crashDirPath = appPath + L"/log";
    std::string url("http://127.0.0.1:8000");
    arguments.push_back("--no-rate-limit");

    //放dump的文件夹 按需改
    base::FilePath db(crashDirPath);
    //crashpad_handler.exe 按需改
    base::FilePath handler(exePath);

    std::unique_ptr<CrashReportDatabase> database =
        crashpad::CrashReportDatabase::Initialize(db);

    if (database == nullptr || database->GetSettings() == NULL)
    {
        return false;
    }

    database->GetSettings()->SetUploadsEnabled(true);

    CrashpadClient client;
    bool ret = client.StartHandler(handler,
        db,
        db,
        url,
        annotations,
        arguments,
        true,
        true);
    if (ret == false)
    {
        return false;
    }

    ret = client.WaitForHandlerStart(INFINITE);
}


int main()
{
	initializeCrashpad();//程序运行前初始化崩溃时生成dmp文件
    int* a = nullptr;
    *a = 9;
    cout << "值为:" << "*a" << endl;
    return 0;
}

7、右键项目名称,点击生成。此时会出现以下错误。

在这里插入图片描述

解决方法:右击项目点击属性进入项目属性页 -> c/c++ -> 预处理器 ->预处理器定义,加入NOMINMAX,然后点击确定,点击应用。

在这里插入图片描述

8、右击项目,点击重新生成。生成成功。

在这里插入图片描述

9、此时会生成解决方案的目录(是项目根目录下的x64文件夹)。在解决方案文件夹找到项目的可执行文件CrashpadTest.exe所在文件夹。在文件夹中加入crashpad如下目录下的两个文件,crashpad_handler.exe和zlib1.dll

项目可执行文件所在目录:

crashpad_handler.exe和zlib1.dll所在目录
在这里插入图片描述
加入后的项目可执行文件目录:
在这里插入图片描述

10、点击可执行文件CrashpadTest.exe。此时在可执行文件目录下就生成了一个log文件夹。点击进入log\reports\,就可以看到生成了一个dump类型的文件。然后双击文件夹在vs2019中打开,就可以看到崩溃所在的文件和代码行。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

至此,windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】使用 Alist 实现阿里云盘4K播放

一、安装 Alist 官方文档 默认安装在 /opt/alist 中 curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install自定义安装路径&#xff0c;将安装路径作为第二个参数添加&#xff0c;必须是绝对路径&#xff0c;如果路径以 alist 结尾&#xff0c;则直接安装到给定…

vite+vue 项目使用 electron

创建 vitevue 项目 npm create viteElectron 官方文档 electron 安装 安装 electron npm install --save-dev electron新建 electron 的入口文件&#xff0c;我这里在根目录新建 electron 文件夹&#xff0c;然后新建main.js和preload.js文件 根据官网说明&#xff0c;将以下…

企业架构LNMP学习笔记21

URL重写&#xff1a; ngx_http_rewrite_module 模块用于使用PCRE正则表达式更改请求URI&#xff0c;返回重定向&#xff0c;以及有条件地选择配置。 return 该指令用于结束结束规则的执行并返回状态码给客户端。 403 Forbidden.服务器已经理解请求,但是拒绝执行它 404 Not…

【动手学深度学习】--序列模型

文章目录 序列模型1.序列数据2.统计工具3.自回归模型3.1马尔科夫假设3.2潜变量模型 4.训练5.预测 序列模型 学习视频&#xff1a;序列模型【动手学深度学习v2】 官方笔记&#xff1a;序列模型 1.序列数据 想象一下有人正在看网飞&#xff08;Netflix&#xff0c;一个国外的视…

基于Docker从零到一实操MySql的主从复制

文章目录 一、在Docker上安装&#xff0c;启动MySQL查看docker是否安装成功安装mysql查看mysql镜像进入mysql后台操作docker Volume&#xff08;卷&#xff09;入门 MySql的主从复制1. 创建MySQL主从复制的网络2. 创建MySQL主服务器3. 创建MySQL从服务器4. 配置主从同步5.测试主…

js函数变量提升理解

var n 10function fn() {// var n 20function f() {// 没用var声明&#xff0c;去外层寻找n,直到找到windows为止&#xff0c;找到的话用的就是哟个全局变量&#xff0c;会改变原始全局变量的值n;console.log(n)}var nn 20f()console.log(n);return f}var x fn()// 会在上一…

【C++从0到王者】第二十八站:二叉搜索树的应用

文章目录 前言一、Key模型二、Key/Value模型总结 前言 二叉搜索树的在现实世界的应用很广泛&#xff0c;比如Key模型&#xff0c;Key-Value模型就是常见的两种的模型 一、Key模型 K模型&#xff1a;K模型即只有key作为关键码&#xff0c;结构中只需要存储Key即可&#xff0c…

PaddleOCR学习笔记2-初步识别服务

今天初步实现了网页&#xff0c;上传图片&#xff0c;识别显示结果到页面的服务。后续再完善。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <…

Activiti7工作流引擎:在线流程编辑器Activiti Modoler5.x

一&#xff1a;简介 有的时候我们的流程图需要业务人员自己绘制&#xff0c;然后使用自己绘制的流程图&#xff0c;此时就需要一个在线流程图编辑器需要集成到我们的web系统中。Activiti Modoler是Activiti官方推出的在线流程编辑器。 二&#xff1a;pom.xml <dependency…

tomcat安装、部署JSPGOU项目、Tomcat多实例

安装 官网找包 Apache Tomcat - Welcome! tomcat 8 准备运行环境 安装tomcat catalina.sh 服务脚本管理文件 server.xml 主配置文件 修改8009&#xff08;删除注释&#xff09; 启动tomcat 访问 为了避免每次进入绝对路径启动tomcat 法二&#xff1a; 三&#xff1a;部署…

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …

搭建自己的OCR服务,第三步:PPOCRLabel标注工具安装

一、安装说明 安装好了PaddleOCR后&#xff0c;还需要安装PPOCRLabel这个标注工具&#xff0c;想要自己训练模型的话&#xff0c;有个标注工具会起很大作用。 尤其是PPOCRLabel就是跟PaddleOCR配套的标注工具&#xff0c;同样是开源的。 在下载 PaddleOCR 整个源码中&#x…

Apache DolphinScheduler - 快速扩展 TaskPlugin 从入门到放弃

目前在大数据生态中&#xff0c;调度系统是不可或缺的一个重要组件。Apache DolphinScheduler 作为一个顶级的 Apache 项目&#xff0c;其稳定性和易用性也可以说是名列前茅的。而对于一个调度系统来说&#xff0c;能够支持的可调度的任务类型同样是一个非常重要的因素&#xf…

如何去除eclipse中default package

选择default package ,然后选择后面的 选择FILTER 选择 Empty开头的几个 点击ok&#xff0c;就可以去掉空的default package

sql:SQL优化知识点记录(十三)

&#xff08;1&#xff09;行锁理论 &#xff08;2&#xff09;CAP理论 二 、 C、 A、P的含义 借用一下维基百科CAP理论一文中关于C、A、P三者的定义。 &#xff08;3&#xff09;行锁案例讲解 MySql5.5以后数据库默认都是InnoDB存储引擎&#xff0c;事物的操作默认给你提交了…

Unity之3D物理导航系统

一 介绍 Unity自带寻路(导航)系统是unity官方自带的一种寻路系统。我们可以通过它来制作简单的寻路&#xff0c;比如可以制作点击某个位置&#xff0c;让角色自动的绕开障碍走到目标点的效果&#xff0c;比如可以制作敌人AI&#xff0c;让它可以通过NavMesh绕开障碍追击我方单…

l8-d9 UDP通信实现

一、函数接口扩展与UDP通信实现流程 1.write/read到send/recv 函数原型&#xff1a; ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); 前三个参数同read/write一样&#xff1b; ssize_t rea…

景联文科技可为多模态语音翻译模型提供数据采集支持

8月22日Facebook的母公司Meta Platforms发布了一种能够翻译和转录数十种语言的人工智能模型——SeamlessM4T&#xff0c;可以在日常生活中或者商务交流中为用户提供更便捷的翻译和转录服务。 相较于传统的文本翻译&#xff0c;这项技术的最大区别在于它可以实现端到端的语音翻译…

对象的构造和析构

目录 构造函数和析构函数 构造函数的分类和调用 c默认构造的函数 浅拷贝和深拷贝 多个对象的构造和析构 初始化列表 类对象作为成员 构造函数和析构函数 对象的初始化和清理是两个非常重要的安全问题&#xff0c;一个对象或者变量没有初始时&#xff0c;对其使用后果是未…

Ae 效果:CC Star Burst

模拟/CC Star Burst Simulation/CC Star Burst CC Star Burst&#xff08;CC 星爆&#xff09;可以模拟星际穿越的效果&#xff0c;也可以像 CC Ball Action 效果模拟球体的扩散运动。 CC Star Burst 效果的原理是将图层网格化&#xff0c;然后基于每个网格里的图层内容取平均颜…