QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件

news2024/9/21 16:38:17

文章目录

  • main.cpp代码捕获异常 生成dmp文件和pdb文件
  • DebugTest生成错误代码
  • 注意

分析软件崩溃,除了需要dmp,还需要这个pdb文件
dmp,文件记录了崩溃的信息,而pdb(代码工程数据库),则包含了你写的代码
通过dump + pdb从而定位到你写的错误代码的地方

main.cpp代码捕获异常 生成dmp文件和pdb文件

#include "DebugTest.h"
#include <QtWidgets/QApplication>
#include <WinSock2.h>
#include <DbgHelp.h>
#include <windows.h>
#include <winnt.h>
#include <QMessageBox>
#include <QString>
#include <QTime>
#include <QDebug>

//防止中文乱码
#pragma execution_character_set("utf-8") 

/**
 * 仅仅包含<DbgHelp.h>头文件并不足以让编译器知道如何链接到相应的库。因此,需要告诉编译器要链接哪个库。在Windows平台上,这通常是通过在源代码文件中使用#pragma comment(lib, "library_name")指令来完成的
 */
//编译器链接Windows 调试帮助库  调试和错误报告
#pragma comment(lib, "Dbghelp.lib")

void CreateMiniDump(EXCEPTION_POINTERS* pep, char* strDumpFile)
{
	/**
	 * strDumpFile:这是一个指向字符串的指针,表示要创建或打开的文件名。
	 * GENERIC_READ | GENERIC_WRITE:这表示我们想要对该文件具有读取和写入的权限。| 符号用于组合这些权限。
	 * 0:这是安全描述符的句柄,用于指定文件的安全属性。在这里,它被设置为 0,表示使用默认的安全描述符。
	 * NULL:这是指向安全属性结构的指针,用于进一步定义文件的安全属性。在这里,它被设置为 NULL,表示使用默认的安全属性。
	 * CREATE_ALWAYS:这是一个标志,指示如果文件已存在,它应该被截断为零长度,然后重新写入。如果文件不存在,它应该被创建。
	 * FILE_ATTRIBUTE_NORMAL:这是一个标志,指示文件应该具有正常的属性。
	 * 0:这是用于文件创建的文件模板的句柄。在这里,它被设置为 0,因为我们不使用文件模板。
	 
	 * 创建一个名为 strDumpFile 的文件(如果它还不存在),或者如果它已经存在,则截断它并重新写入。文件将具有读取和写入的权限,并且具有正常的文件属性

	*/
	HANDLE hFile = CreateFileA(strDumpFile, GENERIC_READ | GENERIC_WRITE, 0,
		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);


	//在程序崩溃或遇到异常时捕获其内存状态
	//文件句柄的意思是用于标识和访问文件的唯一标识符
	//确保hFile是一个有效的文件句柄,它既不是NULL也不是INVALID_HANDLE_VALUE(一个表示无效的句柄的特殊值)
	if (hFile != NULL && hFile != INVALID_HANDLE_VALUE)
	{
		//创建dump文件的额外信息
		MINIDUMP_EXCEPTION_INFORMATION mdei;
		mdei.ThreadId = GetCurrentThreadId();//获取当前线程id
		mdei.ExceptionPointers = pep;//异常发生时的信息
		mdei.ClientPointers = TRUE;//表示`ExceptionPointers`中的指针是有效的

		//设置转储类型
		MINIDUMP_TYPE mdt = MiniDumpWithDataSegs;
		//MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpNormal | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory | MiniDumpWithProcessThreadData | MiniDumpWithThreadInfo);


		//MiniDumpWriteDump是Windows API中的一个函数,用于将当前进程的内存状态写入一个文件
		//它接受多个参数,包括当前进程、进程ID、文件句柄、转储类型以及额外的信息(如mdei)
		BOOL rv = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, mdt,
			&mdei, 0, 0);
		//处理结果
		if (rv)
		{
			//LOG_ERROR("create dump[%s] success.", strDumpFile);
		}
		else
		{
			//LOG_ERROR("create dump[%s]failed Error:[%d].", strDumpFile, GetLastError());
		}

		//关闭文件句柄
		CloseHandle(hFile);
	}
}


//在程序出现异常时,生成一个包含当前日期和时间的dump文件名,并调用一个函数来创建这个dump文件,以记录异常时的程序状态
//WINAPI: 一个宏,通常用于Windows API函数的调用约定
LONG WINAPI MyCustomFilter(EXCEPTION_POINTERS* pep)
{
	//LOG_ERROR("===================Program Exception=====================");
	QString strDumpFile;
	//使用sprintf风格的格式化方法来生成dump文件的名称
	//获取了当前日期和时间
	strDumpFile.sprintf("Dump_%s_%s.dmp", QDate::currentDate().toString("yyyyMMdd").toStdString().c_str(),
		QTime::currentTime().toString("HHmmss").toStdString().c_str());

	//LOG_ERROR("CreateDump Start");
	//创建dump文件 将QString转换为char*格式的C字符串
	CreateMiniDump(pep, strDumpFile.toLatin1().data());
	//LOG_ERROR("CreateDump Finish");
	 
	//结束程序运行
	QApplication::quit();

	//异常已经被处理,可以继续执行后续的代码
	return EXCEPTION_EXECUTE_HANDLER;
}


//出现异常时弹出提醒框
LONG ExceptionCapture(EXCEPTION_POINTERS *pException) {
	
	//弹出错误对话框并退出程序
	//Qt的QMessageBox类来显示一个“critical”(严重)级别的消息框
	//参数:无父窗口 消息框标题 消息框内容 消息框按钮
	QMessageBox::critical(nullptr, "错误提示", QString("程序遇到异常"), QMessageBox::Ok, QMessageBox::Ok);
	return EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
	//注册异常捕获函数
	//SetUnhandledExceptionFilter可以在Windows程序中,让未处理的异常发生时执行自定义的代码
	SetUnhandledExceptionFilter(MyCustomFilter);

    DebugTest w;
    w.show();
    return a.exec();
}

DebugTest生成错误代码

#include "DebugTest.h"
#include "ui_DebugTest.h"

DebugTest::DebugTest(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
	connect(ui.pushButton, &QPushButton::clicked,this,&DebugTest::pushButton_clicked);
}

DebugTest::~DebugTest()
{
}

void DebugTest::pushButton_clicked() {
	//指针不指向任何有效的内存地址
	int *p = nullptr;
	//尝试解引用一个nullptr指针(即使用*p来访问或修改指针指向的值)会导致运行时错误,因为并没有一个有效的内存位置可以访问
	*p = 666666666;
}

注意

只有在工程项目里面配置了这个,才会生成pdb
在这里插入图片描述
设置步骤
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【机器学习-00】机器学习是什么?

在科技飞速发展的今天&#xff0c;机器学习已成为一个热门话题&#xff0c;广泛应用于各个行业和领域。那么&#xff0c;机器学习到底是什么&#xff1f;它又是如何工作的&#xff1f;本文将深入探讨机器学习的定义、原理及其在各领域的应用&#xff0c;带领读者走进这个神秘而…

FGF18:骨关节炎治疗靶标

成纤维细胞生长因子18&#xff08;FGF18&#xff09;属于FGF8亚家族成员&#xff0c;在细胞增殖、细胞分化和细胞迁移的调节中起重要作用&#xff0c;是正常骨化和骨骼发育所需&#xff0c;同时刺激肝脏和肠道增殖。 &#xff08;数据来源AlphaFold&#xff09; FGF18由207个氨…

arcgis怎么选取某个指定区域地方的数据,比如从全国乡镇数据选取长沙市乡镇数据

一共5个步骤&#xff0c;没一句废话&#xff0c;耐心看完。 1、如图&#xff0c;先将数据加载到arcgis里面&#xff0c;我们要选取里面长沙市的范围数据。 2、选取长沙市的语句 “市” like ‘长沙%’ 切记&#xff0c;切记&#xff0c;切记。所有符号要在 输入法英文状态…

重生奇迹mu智力妹妹的召唤技能

很多人错误地认为智能小帮手只是一种辅助职业&#xff0c;没有太多的攻击能力。但是实际情况是&#xff0c;有一些智能小帮手不仅能够提供辅助&#xff0c;而且还可以扮演输出角色。他们的技能加持可以配合召唤宠物的攻击和仇恨&#xff0c;在击败BOSS的过程中发挥重要作用。 召…

【I²C协议】STC89C51单片机IIC通信(代码+原理)

STC89C51单片机IIC通信 什么是IC协议特点构成 通信协议开始信号、结束信号、应答信号数据传输 代码示例 什么是IC协议 IIC,即IC&#xff0c;全称 Inter-Integrated Circuit&#xff0c;字面上的意思是集成电路之间&#xff0c;它其实是IC Bus简称&#xff0c;所以中文应该叫 集…

ELK企业级日志分析

目 录 一、ELK简介 1.1 elasticsearch简介 1.2 logstash简介 1.3 kibana简介 1.4 ELK的好处 1.5 ELK的工作原理 二、部署ELK 2.1 部署elasticsearch(集群) 2.1.1 修改配置文件 2.1.2 修改系统参数 2.1.2.1 修改systemmd服务管理器 2.1.2.2 性能调优参数 2.1.2.3 …

网络和安全操作

一、编辑文件 文本编辑器有很多&#xff0c;比如图形模式的gedit、OpenOffice 等&#xff0c;文本模式下的编辑器有vi、vim&#xff08;vi的增强版本&#xff09;等。vi和vim是我们在Linux中最常用的编辑器。 gedit&#xff1a;类似于windows下的记事本&#xff0c;很方便的去…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

ROS参数服务器理论模型

ROS参数服务器理论模型 参数服务器角色实现参数服务器流程参数可以使用的类型 参数服务器角色 参数服务器实现是最为简单的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (参数设置者)Listener (参数调用者) 实现参数服务器流程 整个流…

“论企业集成平台的理解与应用”,软考高级论文,系统架构设计师论文

论文真题 企业集成平台&#xff08;Enterprise Imtcgation Plaform,EIP)是支特企业信息集成的像环境&#xff0c;其主要功能是为企业中的数据、系统和应用等多种对象的协同行提供各种公共服务及运行时的支撑环境。企业集成平台能够根据业务模型的变化快速地进行信息系统的配置…

业务能力构建设计规划咨询项目(48页PPT)

业务能力构建设计规划咨询项目旨在为企业提供全面系统的指导与支持&#xff0c;通过48页PPT详细阐述如何从零开始建立起一套高效的业务体系。该项目将首先识别企业的核心竞争力&#xff0c;分析市场需求和内部资源配置&#xff0c;制定出切实可行的战略规划。 从流程优化、技术…

图片如何去水印,PS 图片去水印的几种常见方法

在数字图像的世界里&#xff0c;水印常常被用来标识版权或防止未经授权的使用&#xff0c;但有时它们却成为了美观的障碍。无论是出于个人偏好还是专业需求&#xff0c;去除图片上的水印已经成为一项常见的任务。 Adobe Photoshop 作为行业标准的图像编辑软件&#xff0c;提供…

Golang | Leetcode Golang题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; func searchMatrix(matrix [][]int, target int) bool {m, n : len(matrix), len(matrix[0])x, y : 0, n-1for x < m && y > 0 {if matrix[x][y] target {return true}if matrix[x][y] > target {y--} else {x}}return f…

卸载linux 磁盘的内容,磁盘占满

Linux清理磁盘 https://www.cnblogs.com/siyunianhua/p/17981758 当前文件夹下&#xff0c;数量 ls -l | grep "^-" | wc -l ls -lR | grep "^-" | wc -l 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找…

【简单介绍Gitea】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

第十四届蓝桥杯省赛C++C组A题【求和】题解(AC)

法一 用 for 循环计算序列和。 法二 使用等差数列求和公式。 #include <iostream> #include <algorithm> #include <cstring>using namespace std;typedef long long LL;int main() {LL res 0;for (int i 1; i < 20230408; i )res i;cout <<…

自定义View(8)View的绘制流程

安卓UI的重点之一就是View的绘制流程&#xff0c;经常出现在面试题中。熟悉View的绘制流程&#xff0c;不仅能轻松通过View相关的面试&#xff0c;也可以让我们更加方便的使用自定义View以及官方View。此篇先以常见面试题为切入点&#xff0c;说明自定义View的重要性&#xff0…

Qt Style Sheets-设计器集成

设计器集成 Qt Designer&#xff08;Qt Designer&#xff09;是一个出色的工具&#xff0c;用于预览样式表。您可以在 Designer 中右键单击任何小部件&#xff0c;并选择“更改样式表...”来设置样式表。 在 Qt 4.2 及更高版本中&#xff0c;Qt Designer 还包括一个样式表语法…

Unity Apple Vision Pro 开发(四):体积相机 Volume Camera

文章目录 &#x1f4d5;教程说明&#x1f4d5;教程内容概括&#x1f4d5;体积相机作用&#x1f4d5;创建体积相机&#x1f4d5;添加体积相机配置文件&#x1f4d5;体积相机配置文件参数&#x1f4d5;体积相机的边界盒大小&#x1f4d5;体积相机边界盒大小和应用边界盒大小的区别…