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

文章目录

  • 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();//获取当前线程idmdei.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://xiahunao.cn/news/3247110.html

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

相关文章

全局 loading

好久不见&#xff01; 做项目中一直想用一个统一的 loading 状态控制全部的接口加载&#xff0c;但是一直不知道怎么处理&#xff0c;最近脑子突然灵光了一下想到了一个办法。 首先设置一个全局的 loading 状态&#xff0c;优先想到的就是 Pinia 然后因为页面会有很多接口会…

AI软件小说推文直接生成漫画短视频,小说推广项目的辅助工具,前端uniapp。

有哪些AI的软件是比较热门的&#xff1f; 以下是一些常用的网页AI软件&#xff0c;可以用于绘图&#xff1a; Canva&#xff1a;Canva是一个非常受欢迎的网页平台&#xff0c;提供各种图形设计和绘图工具。它具有易于使用的界面和大量的模板和元素&#xff0c;可以帮助你创建出…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…

【网络安全】PostMessage:分析JS实现XSS

未经许可&#xff0c;不得转载。 文章目录 前言示例正文 前言 PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口&#xff08;例如&#xff0c;来自同一域名下的不同页面或者不同域名下的跨域页面&#xff09;进行通信&#xff0c;而无需通过服务器…

【线程系列之五】线程池介绍C语言

一、基本概念 1.1 概念 线程池&#xff08;Thread Pool&#xff09;是一种基于池化技术管理线程的机制&#xff0c;旨在减少线程创建和销毁的开销&#xff0c;提高系统资源的利用率&#xff0c;以及更好地控制系统中同时运行的线程数量。线程池通过预先创建一定数量的线程&am…

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型&#xff08;model&#xff09;用来数据存储&#xff0c;视图&#xff08;view&#xff09;用来展示数据。因此&#xff0c;模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示&#xff1a; 由图可知&#xff0c;模型向视图提供数…

Python | Leetcode Python题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:length len(nums)# L 和 R 分别表示左右两侧的乘积列表L, R, answer [0]*length, [0]*length, [0]*length# L[i] 为索引 i 左侧所有元素的乘积# 对于索引为…

一文掌握Prometheus实现页面登录认证并集成grafana

一、接入方式 以保护Web站点的访问控制&#xff0c;如HTTP 服务器配置中实现安全的加密通信和身份验证&#xff0c;保护 Web 应用程序和用户数据的安全性。 1.1 加密密码 通过httpd-tools工具包来进行Web站点加密 yum install -y httpd-tools方式一&#xff1a;通过htpasswd生…

人工智能 (AI) 应用:一个异常肺呼吸声辅助诊断系统

关键词&#xff1a;深度学习、肺癌、多标签、轻量级模型设计、异常肺音、音频分类 近年来&#xff0c;流感对人类的危害不断增加&#xff0c;COVID-19疾病的迅速传播加剧了这一问题&#xff0c;导致大多数患者因呼吸系统异常而死亡。在这次流行病爆发之前&#xff0c;呼吸系统…

【时时三省】(C语言基础)变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 变量 可以改变的量 比如 int age&#xff1d;20 &#xff08;类型 变量的名字&#xff1d;0&#xff09; 如果后面要改可以直接代入 age&#xff1d;age1 age可以是任何字母 变量的分类…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class&#xff0c;该类继承自 cc.Graphics&#xff0c;用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

Qt实现简单的导航进度条——自定义控件

导航进度条通过其动态的视觉效果&#xff0c;‌不仅提供了任务进度的实时反馈&#xff0c;‌还增强了用户体验的流畅性和直观性。‌“进度”的设计方式多种多样&#xff0c;不同种类的运用需要根据具体场景来规划具体的进度方式&#xff0c;一般都要在清楚了解了每个方式的设计…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求&#xff1a;勇敢地对不合理的需求说不系统架构&#xff1a;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引&#xff1a;根据需求编写良…

JavaEE--JavaWeb服务器的安装配置(Tomcat服务器安装配置)

前言: 本文介绍了 Java Web 服务器 Tomcat 的安装配置&#xff0c;并详细说明了如何在 IntelliJ IDEA 中配置服务器&#xff0c;创建 JavaEE 项目&#xff0c;并发布文章。文章首先解释了前端程序如何访问后端程序以及 Web 服务器的概念&#xff0c;然后详细介绍了安装 Tomcat…

各地跨境电子商务示范区工具变量DID数据(2010-2022年)

数据来源&#xff1a;参考李震等&#xff08;2023&#xff09;的做法&#xff0c;从官方网站上搜集整理了我国跨境电子商务示范区名单与上市公司进行匹配制作。时间跨度&#xff1a;2010-2022年数据范围&#xff1a;上市企业包含指标&#xff1a; stock year 证券简称 In…

大模型RAG优化方案与实践(非常详细)从入门到精通,看这一篇就够了

RAG通过检索现有的大量知识&#xff0c;结合强大的生成模型&#xff0c;为复杂的问答、文本摘要和生成任务带来了全新的解决方案。本文详细的介绍了RAG遇到的挑战、通用范式、工程实践、优化实现策略等。 一、RAG的背景介绍 随着ChatGPT的兴起&#xff0c;大语言模型再次走进…

伪分布式部署 DolphinScheduler

1.添加用户 useradd dolphinscheduler echo "dolphinscheduler" | passwd --stdin dolphinscheduler sed -i $adolphinscheduler ALL(ALL) NOPASSWD: NOPASSWD: ALL /etc/sudoers sed -i s/Defaults requirett/#Defaults requirett/g /etc/sudoers chown -R …

7.17IO

1. #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 功能描述&#xff1a;打开name文件夹&#xff0c;返回该文件夹的描述符 返回值&#xff1a;成功返回描述符&#xff0c;失败返回NULL opendir()函数打开与目录名对应的目录流…

ssrf复习(及ctfshow351-360)

1. SSRF 概述 服务器会根据用户提交的URL发送一个HTTP请求。使用用户指定的URL&#xff0c;Web应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 如果没有对用户提交URL和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造"的缺陷…

C++之智能指针:shared_ptr、unique_ptr、weak_ptr的概念、用法即它们之间的关系

智能指针 (1)概述 A.Why&#xff08;C为什么引入智能指针&#xff09; C引入智能指针的根本原因就是解决手动管理动态内存所带来的问题&#xff0c;手动管理动态内存常见的问题如下&#xff1a;内存泄漏、悬挂指针、释放操作未定义等 内存泄漏问题&#xff1a; 当程序用光了它…