当前位置: 首页 > news >正文

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录

  • 一、Pdb生成及Dump文件使用示例图
    • 1.Pdb文件生成
    • 2.Dump文件调试
    • 3.参数不全Pdb生成的Dump文件调试
  • 二、个人理解
    • 1.生成Pdb文件的方式
    • 2.Dump文件不生产的情况
  • 三、源码
    • Pro文件
    • mian.cpp
    • MainWindow
    • Ui文件
  • 总结

一、Pdb生成及Dump文件使用示例图

1.Pdb文件生成

下图先通过构建生成Pdb文件,然后运行程序,通过提前准备的崩溃按钮使得程序崩溃,生成“dump文件”的演示。
123456

2.Dump文件调试

下图是先将之前生成的Pdb文件移动至dump文件同级目录,然后使用Visual Studio打开dump文件,在界面中点击使用’仅限本机’进行调试调试程序。
在这里插入图片描述

3.参数不全Pdb生成的Dump文件调试

下图使用的Pdb文件为是在缺少相关参数的状态下生成的(只有生成Pdb文件的命令符),可以看到打开后点击使用’仅限本机’进行调试调试程序显示的崩溃位置是异常的。
在这里插入图片描述

二、个人理解

1.生成Pdb文件的方式

我整合的的生成Pdb方式有多种,如下:

  1. 在Qt项目内容中配置添加"CONFIG += force_debug_info"(如下图),参考Qt-生成dump文件,该链接中还额外添加了"CONFIG+=separate_debug_info"的内容,但是我个人测试只添加"CONFIG += force_debug_info"也可以调试测试(测试范围不全面,欢迎指正)。(注:配置内容仅支持当前位置的项目,更换项目或者更换位置,都需要重新添加。)
    在这里插入图片描述
  2. 在pro文件添加CONFIG += force_debug_info也可生成Pdb文件用于调试。(注:在Pro文件添加后,该项目任意位置可生成Pdb文件。)
    在这里插入图片描述
  3. 在pro文件添加QMAKE_CXXFLAGS_RELEASE += Q M A K E C F L A G S R E L E A S E W I T H D E B U G I N F O 和 Q M A K E L F L A G S R E L E A S E + = QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO和QMAKE_LFLAGS_RELEASE += QMAKECFLAGSRELEASEWITHDEBUGINFOQMAKELFLAGSRELEASE+=QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO可生成Pdb文件用于调试。**(注:在Pro文件添加后,该项目任意位置可生成Pdb文件,在添加QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO后是可以生成Pdb文件,但是生成的Pdb文件会有异常,可参考“第一段 第三节 参数不全Pdb生成的Dump文件调试效果”。)**参考链接QT如何在Release编译下生成pdb文件
    在这里插入图片描述
  4. 可更新Qt安装目录下对应编译器的msvc-desktop.conf文件,更新QMAKE_CFLAGS_RELEASE为:QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD -O2 -MD -Zi(如下图一),更新QMAKE_LFLAGS_RELEASE为:QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG(如下图二)。 ** (注:更新msvc-desktop.conf文件后,当前编译器所编译的所有项目都会生成Pdb文件,仅更新QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG也可生成Pdb文件,同样生成的Pdb文件会有异常,可参考“第一段 第三节 参数不全Pdb生成的Dump文件调试效果”。)**参考链接QT如何在Release编译下生成pdb文件
    在这里插入图片描述
    在这里插入图片描述

2.Dump文件不生产的情况

有些电脑中同一种状态不会崩溃,可能是被Qt事件循环接收处理了。
如本文中的情况,我个人在公司的电脑和我家的电脑运行就是只有一个生成Dump文件。
我个人测试(无法生成Dump文件的电脑),使用纯C++的代码可进入指定的Dump生成函数,只要进入Qt事件循环后就无法进入Dump生成函数,猜测是被Qt事件循环接收处理了

三、源码

Pro文件

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11#################### 1 #########################
## 在“Pro”文件中添下方代码后可生成PDB文件(影响当前项目)
## 生成PDB PdbDumpTest.pdb PdbDumpTest.vc.pdb
CONFIG += force_debug_info#################### 2 #########################
## 生成PDB PdbDumpTest.pdb
#QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
#QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO#################### 3 #########################
## 在“构建设置”中“Build的步骤”中的“Additional arguments”添下方代码后可生成PDB文件(影响当前目录的当前项目)
# "CONFIG += force_debug_info"#################### 4 #########################
## 在下方对应目录文件中,参考如下更新文件的QMAKE_LFLAGS_RELEASE的赋值数据即可(影响所有项目)
## C:\Qt\Qt5.xx.xx\5.xx.xx\msvc2017_64\mkspecs\common\msvc-desktop.conf
#QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE (-MD -O2 -MD -Zi)
#QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO (/DEBUG)# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mian.cpp

#include "mainwindow.h"#include <QApplication>
#include <QDebug>
#include <QDir>
#include <QDateTime>
#include <QSharedMemory>
#include <QProcess>
#include <QMessageBox>#ifdef Q_OS_WIN
#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
#endifLONG WINAPI SystemExceptionCall(_EXCEPTION_POINTERS* ExceptionInfo)
{// 获取生成路径QString logFile = QApplication::applicationDirPath() + "/dump";// 判断路径是否存在if (!QDir(logFile).exists()){// 路径不存在则创建QDir().mkpath(logFile);}// 生成dump文件路径及名称QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyyMMdd-hh_mm_ss"));// 创建dump文件
#if 0// 使用CreateFile创建Dump文件,适用于包含详细参数的文件创建HANDLE hDumpFile = CreateFile(dumpName.toStdWString().c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#else// Pdb文件的配置参数(如文件显隐,编辑状态等)LPCREATEFILE2_EXTENDED_PARAMETERS fileParam = Q_NULLPTR;// 使用CreateFile2创建Dump文件,适用于普通文件创建,通常不需要其他配置参数使用该函数更为快捷HANDLE hDumpFile = CreateFile2(dumpName.toStdWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, fileParam);
#endifif (hDumpFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ThreadId = GetCurrentThreadId();   // 当前现场IddumpInfo.ExceptionPointers = ExceptionInfo; // 当前异常指针dumpInfo.ClientPointers = TRUE; // 写入Dump文件时,可以直接引用相关内存地址// 创建Dump文件MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &dumpInfo, Q_NULLPTR, Q_NULLPTR);// 关闭文件句柄CloseHandle(hDumpFile);}return EXCEPTION_EXECUTE_HANDLER;
}int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN//! 注册异常奔溃回调SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)SystemExceptionCall);
#endifQApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

MainWindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_btnCrash_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnCrash_clicked()
{
//    qCritical("test");qDebug() << "123456" << __FUNCTION__;int b = 10;int a = 10/(b-10);qDebug() << "123456" << a;
}

Ui文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>330</width><height>207</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><layout class="QGridLayout" name="gridLayout"><item row="0" column="1"><spacer name="verticalSpacer"><property name="orientation"><enum>Qt::Vertical</enum></property><property name="sizeHint" stdset="0"><size><width>20</width><height>52</height></size></property></spacer></item><item row="1" column="0"><spacer name="horizontalSpacer"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>110</width><height>20</height></size></property></spacer></item><item row="1" column="1"><widget class="QPushButton" name="btnCrash"><property name="text"><string>崩溃</string></property></widget></item><item row="1" column="2"><spacer name="horizontalSpacer_2"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>109</width><height>20</height></size></property></spacer></item><item row="2" column="1"><spacer name="verticalSpacer_2"><property name="orientation"><enum>Qt::Vertical</enum></property><property name="sizeHint" stdset="0"><size><width>20</width><height>51</height></size></property></spacer></item></layout></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>330</width><height>23</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

总结

通过配置编辑项目,并使用系统提供的接口设置Dump文件生成函数,最后使用Vs调试代码即可。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

相关文章:

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图 1.Pdb文件生成 下图先通过…...

视频号视频怎么保存到手机,视频号视频怎么保存到手机相册里,苹果手机电脑都可以用

随着数字媒体的蓬勃发展&#xff0c;视频已成为我们日常生活中不可或缺的一部分。视频号作为众多视频分享平台中的一员&#xff0c;吸引了大量用户上传和分享各类精彩视频。然而&#xff0c;有时我们可能希望将视频号上的视频下载下来,以下将详细介绍如何将视频号的视频。 方法…...

Softmax函数的作用

Softmax 函数主要用于多类别分类问题&#xff0c;它将输入的数值转换为概率分布。 具体来说&#xff0c;对于给定的输入向量 x [x_1, x_2,..., x_n] &#xff0c;Softmax 函数的输出为 y [y_1, y_2,..., y_n] &#xff0c;其中&#xff1a; 这样&#xff0c;Softmax 函数的输…...

cesium 添加 Echarts 图层(空气质量点图)

cesium 添加 Echarts 图层(下面附有源码) 1、实现思路 1、在scene上面新增一个canvas画布 2、通坐标转换,将经纬度坐标转为屏幕坐标来实现 3、将ecarts 中每个series数组中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代码 <!DOCTYPE html> <html lan…...

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下&#xff1a; 一、Python学习方法 分解自己的学习目标&#xff1a;可以将学习目标分基础知识&#xff0c;进阶知识&#xff0c;高级应用&#xff0c;实…...

Nacos-注册中心

一、注册中心的交互流程 注册中心通常有两个角色: 服务提供者(生产者)&#xff1a;对外提供服务的微服务应用。它会把自身的服务地址注册到注册中心&#xff0c;以供消费者发现和调用。服务调用者(消费者)&#xff1a;调用其他微服务的应用程序。它会向注册中心订阅自己需要的服…...

Unity制作一个简单抽卡系统(简单好抄)

业务流程&#xff1a;点击抽卡——>播放动画——>显示抽卡面板——>将随机结果添加到面板中——>关闭面板 1.准备素材并导入Unity中&#xff08;包含2个抽卡动画&#xff0c;抽卡结果的图片&#xff0c;一个背景图片&#xff0c;一个你的展示图片&#xff09; 2.给…...

简单多状态DP问题

这里写目录标题 什么是多状态DP解决多状态DP问题应该怎么做&#xff1f;关于多状态DP问题的几道题1.按摩师2.打家劫舍Ⅱ3.删除并获得点数4.粉刷房子5.买卖股票的最佳时期含手冷冻期 总结 什么是多状态DP 多状态动态规划&#xff08;Multi-State Dynamic Programming, Multi-St…...

cpu,缓存,辅存,主存之间的关系及特点

关系图 示意图&#xff1a; ------------------- | CPU | | ------------- | | | 寄存器 | | | ------------- | | | L1缓存 | | | ------------- | | | L2缓存 | | | ------------- | | | L3缓存 | | | ------------- | ----…...

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…...

chrome-base源码分析(1)macros模块

Chrome-base源码分析(2)之Macros模块 Author&#xff1a;Once Day Date&#xff1a;2024年6月29日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: 源码分析_Once-Day的博客-CSDN博客 参考文档: macros - Chromium Code SearchChrome base 库详解&#xff1a;工…...

玩转springboot之springboot定制嵌入式的servlet

springboot定制嵌入式的servlet容器 修改容器配置 有两种方式可以修改容器的配置 可以直接在配置文件中修改和server有关的配置 server.port8081 server.tomcat.uri-encodingUTF-8//通用的Servlet容器设置 server.xxx //指定Tomcat的设置 server.tomcat.xxx编写一个EmbeddedSer…...

dell服务器RAID5磁盘阵列出现故障的解决过程二——热备盘制作与坏盘替换过程

目录 背景方案概念全局热备&#xff08;Global Hot Spare&#xff09;&#xff1a;独立热备&#xff08;Dedicated Hot Spare&#xff09;&#xff1a; 过程8号制作成热备清除配置制作独立热备热备顶替坏盘直接rebuild 更换2号盘2号热备 注意注意事项foreign状态要先清除配置 背…...

Elasticsearch开启认证|为ES设置账号密码|ES账号密码设置|ES单机开启认证|ES集群开启认证

文章目录 前言单节点模式开启认证生成节点证书修改ES配置文件为内置账号添加密码Kibana修改配置验证 ES集群开启认证验证 前言 ES安装完成并运行&#xff0c;默认情况下是允许任何用户访问的&#xff0c;这样并不安全&#xff0c;可以为ES开启认证&#xff0c;设置账号密码。 …...

Excel 数据筛选难题解决

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例&#xff1a;创建一个webScoket实例对象1.1、WebSocket.Server(options[&#xff0c;callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…...

分治精炼宝库-----快速排序运用(⌯꒪꒫꒪)੭

目录 一.基本概念: 一.颜色分类&#xff1a; 二.排序数组&#xff1a; 三.数组中的第k个最大元素&#xff1a; 解法一&#xff1a;快速选择算法 解法二&#xff1a;简单粗暴优先级队列 四.库存管理Ⅲ&#xff1a; 解法一&#xff1a;快速选择 解法二&#xff1a;简单粗…...

快速修复mfc100u.dll丢失解决方案

相连文章&#xff1a;SecureCRT的安装破解 [详细过程2024] 有小伙伴向我反馈在打开SecureFX注册机之后显示【mfc100u.dll找不到】重装之后也没有用&#xff0c;这个是因为Microsoft Visual C的运行时组件和库出现了错误&#xff0c;直接选择重新安装就可以 出现这种情况的原因…...

【C++深度探索】继承机制详解(一)

hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1…...

力扣第218题“天际线问题”

在本篇文章中&#xff0c;我们将详细解读力扣第218题“天际线问题”。通过学习本篇文章&#xff0c;读者将掌握如何使用扫描线算法和堆来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...