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

news/2025/2/21 10:42:32/

我们在刚开始项目开发时,经常会因为各种粗心造成各种各样的容易使项目运行时崩溃的代码,比如,给空指针的指向赋值。然而,当项目的文件数非常多时,想找到出错的代码的位置是费事而让人心烦的。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.ppmy.cn/news/1097984.html

相关文章

maven项目pom.xml文件里面各配置的含义

当讨论Maven项目的pom.xml文件时&#xff0c;涉及到很多配置项。下面是对一些常见配置项的详细解释&#xff1a; <project>&#xff1a;根元素&#xff0c;它是整个pom.xml文件的顶级元素。xmlns&#xff1a;一个XML命名空间定义&#xff0c;指定Maven POM模型版本号。x…

小程序代码管理

“微信开发者工具”点击版本管理&#xff0c;然后点击代码管理会打开代码管理网页。 选择对应的项目组。 进来后点击创建项目。 输入git名称&#xff0c;然后选择命名空间&#xff0c;最后创建即可。 在刚才的“微信开发者工具”选择设置&#xff0c;然后添加远程。 输入名称&…

Android MeidiaCodec之OMXPluginBase与QComOMXPlugin实现本质(四十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

mysql drop table 死锁

1.场景 mysql出现大量的drop table阻塞操作 2.从会话表 processlist 里面和事务表INNODB_TRX里面并找不到正在占用锁的会话和事务 3.分析锁信息&#xff1a; INNODB_LOCKs 和INNODB_LOCK_waits 4.有问题的查询&#xff1a;可能会导致整个db的阻塞吗&#xff1f; | 2576901 | …

基于SSM的校园美食交流系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

人大金仓分析型数据库使用之创建和管理表

目录 前言 一、创建表 1、选择列的数据类型 2、设置表和列约束 3、选择表分布策略 前言 数据库的表与任何一种关系型数据库中的表类似&#xff0c;不过其表中的行被分布在系统中的不同实例上。 当用户创建一个表时&#xff0c;用户会指定该表的分布策略。 一、创建…

LeetCode刷题笔记【31】:动态规划专题-3(整数拆分、不同的二叉搜索树)

文章目录 前置知识343. 整数拆分题目描述解题思路代码进一步优化 96.不同的二叉搜索树题目描述解题思路代码优化改进 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【29】&#xff1a;动态规划专题-1&#xff08;斐波那契数、爬楼梯、使用最小花费爬楼梯&…

51单片机-直流电机学习

简介 51单片机采用的是5V的直流电机 轴长&#xff1a;8mm 轴径&#xff1a;2mm 电压&#xff1a;1-6V 参考电流&#xff1a;0.35-0.4A 3V 转速&#xff1a;17000-18000 转每分钟 他的组成&#xff1a; 直流电机的结构应由 定子 和 转子 两大部分组成。 直流电机运行时静止…