发布时间:2026/9/4 13:47:30
Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码) 文章目录一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况三、源码Pro文件mian.cppMainWindowUi文件总结一、Pdb生成及Dump文件使用示例图1.Pdb文件生成下图先通过构建生成Pdb文件然后运行程序通过提前准备的崩溃按钮使得程序崩溃生成“dump文件”的演示。2.Dump文件调试下图是先将之前生成的Pdb文件移动至dump文件同级目录然后使用Visual Studio打开dump文件在界面中点击使用’仅限本机’进行调试调试程序。3.参数不全Pdb生成的Dump文件调试下图使用的Pdb文件为是在缺少相关参数的状态下生成的只有生成Pdb文件的命令符可以看到打开后点击使用’仅限本机’进行调试调试程序显示的崩溃位置是异常的。二、个人理解1.生成Pdb文件的方式我整合的的生成Pdb方式有多种如下在Qt项目内容中配置添加CONFIG force_debug_info如下图参考Qt-生成dump文件该链接中还额外添加了CONFIGseparate_debug_info的内容但是我个人测试只添加CONFIG force_debug_info也可以调试测试测试范围不全面欢迎指正。注配置内容仅支持当前位置的项目更换项目或者更换位置都需要重新添加。在pro文件添加CONFIG force_debug_info也可生成Pdb文件用于调试。注在Pro文件添加后该项目任意位置可生成Pdb文件。在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 QMAKEC​FLAGSR​ELEASEW​ITHD​EBUGINFO和QMAKEL​FLAGSR​ELEASEQMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO可生成Pdb文件用于调试。**注在Pro文件添加后该项目任意位置可生成Pdb文件在添加QMAKE_LFLAGS_RELEASE $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO后是可以生成Pdb文件但是生成的Pdb文件会有异常可参考“第一段 第三节 参数不全Pdb生成的Dump文件调试效果”。**参考链接QT如何在Release编译下生成pdb文件可更新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文件QTcore guigreaterThan(QT_MAJOR_VERSION,4):QTwidgets CONFIGc11####################1######################### ## 在“Pro”文件中添下方代码后可生成PDB文件影响当前项目 ## 生成PDB PdbDumpTest.pdb PdbDumpTest.vc.pdb CONFIGforce_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 compileifit uses deprecated APIs.#In order todoso,uncomment the following line.#DEFINESQT_DISABLE_DEPRECATED_BEFORE0x060000# disables all the APIs deprecated before Qt6.0.0SOURCES\ main.cpp \ mainwindow.cpp HEADERS\ mainwindow.h FORMS\ mainwindow.ui#Default rulesfordeployment.qnx:target.path/tmp/$${TARGET}/binelse:unix:!android:target.path/opt/$${TARGET}/bin!isEmpty(target.path):INSTALLStargetmian.cpp#includemainwindow.h#includeQApplication#includeQDebug#includeQDir#includeQDateTime#includeQSharedMemory#includeQProcess#includeQMessageBox#ifdefQ_OS_WIN#includeWindows.h#includeDbgHelp.h#pragmacomment(lib,dbghelp.lib)#endifLONG WINAPISystemExceptionCall(_EXCEPTION_POINTERS*ExceptionInfo){// 获取生成路径QString logFileQApplication::applicationDirPath()/dump;// 判断路径是否存在if(!QDir(logFile).exists()){// 路径不存在则创建QDir().mkpath(logFile);}// 生成dump文件路径及名称QString dumpNameQString(%1/%2.dmp).arg(logFile).arg(QDateTime::currentDateTime().toString(yyyyMMdd-hh_mm_ss));// 创建dump文件#if0// 使用CreateFile创建Dump文件适用于包含详细参数的文件创建HANDLE hDumpFileCreateFile(dumpName.toStdWString().c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);#else// Pdb文件的配置参数如文件显隐编辑状态等LPCREATEFILE2_EXTENDED_PARAMETERS fileParamQ_NULLPTR;// 使用CreateFile2创建Dump文件适用于普通文件创建通常不需要其他配置参数使用该函数更为快捷HANDLE hDumpFileCreateFile2(dumpName.toStdWString().c_str(),GENERIC_WRITE,FILE_SHARE_READ,CREATE_ALWAYS,fileParam);#endifif(hDumpFile!INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ThreadIdGetCurrentThreadId();// 当前线程IddumpInfo.ExceptionPointersExceptionInfo;// 当前异常指针dumpInfo.ClientPointersTRUE;// 写入Dump文件时可以直接引用相关内存地址// 创建Dump文件MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hDumpFile,MiniDumpWithDataSegs,dumpInfo,Q_NULLPTR,Q_NULLPTR);// 关闭文件句柄CloseHandle(hDumpFile);}returnEXCEPTION_EXECUTE_HANDLER;}intmain(intargc,char*argv[]){#ifdefQ_OS_WIN//! 注册异常奔溃回调SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)SystemExceptionCall);#endifQApplicationa(argc,argv);MainWindow w;w.show();returna.exec();}MainWindowmainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindowQT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMESPACEclassMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parentnullptr);~MainWindow();privateslots:voidon_btnCrash_clicked();private:Ui::MainWindow*ui;};#endif// MAINWINDOW_Hmainwindow.cpp#includemainwindow.h#includeui_mainwindow.h#includeQDebugMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_btnCrash_clicked(){// qCritical(test);qDebug()123456__FUNCTION__;intb10;inta10/(b-10);qDebug()123456a;}Ui文件?xml version1.0 encodingUTF-8?uiversion4.0classMainWindow/classwidgetclassQMainWindownameMainWindowpropertynamegeometryrectx0/xy0/ywidth330/widthheight207/height/rect/propertypropertynamewindowTitlestringMainWindow/string/propertywidgetclassQWidgetnamecentralwidgetlayoutclassQGridLayoutnamegridLayoutitemrow0column1spacernameverticalSpacerpropertynameorientationenumQt::Vertical/enum/propertypropertynamesizeHintstdset0sizewidth20/widthheight52/height/size/property/spacer/itemitemrow1column0spacernamehorizontalSpacerpropertynameorientationenumQt::Horizontal/enum/propertypropertynamesizeHintstdset0sizewidth110/widthheight20/height/size/property/spacer/itemitemrow1column1widgetclassQPushButtonnamebtnCrashpropertynametextstring崩溃/string/property/widget/itemitemrow1column2spacernamehorizontalSpacer_2propertynameorientationenumQt::Horizontal/enum/propertypropertynamesizeHintstdset0sizewidth109/widthheight20/height/size/property/spacer/itemitemrow2column1spacernameverticalSpacer_2propertynameorientationenumQt::Vertical/enum/propertypropertynamesizeHintstdset0sizewidth20/widthheight51/height/size/property/spacer/item/layout/widgetwidgetclassQMenuBarnamemenubarpropertynamegeometryrectx0/xy0/ywidth330/widthheight23/height/rect/property/widgetwidgetclassQStatusBarnamestatusbar//widgetresources/connections//ui总结通过配置编辑项目并使用系统提供的接口设置Dump文件生成函数最后使用Vs调试代码即可。友情提示——哪里看不懂可私哦让我们一起互相进步吧创作不易请留下一个免费的赞叭 谢谢 ^o^/)注文章为作者编程过程中所遇到的问题和总结内容仅供参考若有错误欢迎指出。注如有侵权请联系作者删除

相关新闻

2026/9/4 13:47:30

yolov8 配置环境以及入门级识别 保姆级教程 小白一看就懂!!!

研究了这么久的yolo姿态算法终于入门啦!!!! 那么接下来由我带领大家进入yolo世界,首先安装软件,需要vscode,python,pycharm以及Anaconda(它的下载路径不能有中文)。具体安装方法搜一下就有了,本文不详细介绍喽。还需要到网站去下载开源代码,当然你也可以进我主页找…

2026/9/4 13:47:30

IIS 正向代理和反向代理(一):转换端口

反向代理(一)转换端口 文章目录 反向代理(一)转换端口前言☆☆☆ 实现效果一、下载相关IIS插件二、配置2.1 Application Request Routing(ARRv3.0)2.2 Url-Rewite 三、开始反向代理3.1 新建网站3.2 URL 重写3.3 开始测试 总结 前言…

2026/9/4 15:37:46

200行Python跑通物质点法:Taichi MPM88 固体仿真快速上手指南

200行Python跑通物质点法:Taichi MPM88 固体仿真快速上手指南 【免费下载链接】taichi Productive, portable, and performant GPU programming in Python. 项目地址: https://gitcode.com/GitHub_Trending/ta/taichi Taichi 是嵌入 Python 的高性能并行计算…

2026/9/4 15:37:46

Unity UGUI三维旋转循环菜单:从Canvas到3D交互的完整实现

简介:本资源是一个面向Unity中高级开发者的UGUI交互式UI实践项目,聚焦于突破传统2D菜单限制,实现支持无限循环的3D空间旋转菜单效果。项目完整呈现了Canvas世界空间布局、RectTransform与Transform协同控制、环形菜单项动态排序及平滑旋转动画…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/4 0:00:58

STM32H743 SPI从机DMA双缓冲通信实战

简介:本资源是面向嵌入式开发工程师与STM32进阶学习者的SPI DMA双机通信从机端完整实现方案,聚焦STM32H743高性能Cortex-M7单片机在工业控制与高速数据交互场景下的从机通信开发痛点。压缩包含1355个文件,主体为599个C源码与321个头文件&…

2026/9/4 0:00:58

CPU开盖降温教程:20元成本让温度直降30度的原理与实践

最近很多朋友都在抱怨,自己的电脑一到夏天就变成"烤箱",玩游戏时CPU温度动不动就飙到90度以上,风扇噪音堪比直升机。更让人头疼的是,明明配置不错,却因为高温降频导致性能大打折扣。如果你也遇到了类似问题&…

2026/9/4 0:00:58

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验 App 14「运动场地预约」场地 Tab(Func1Tab),是整 App 交互最丰富的页面——场地横向切换 三色图例 渐变预约预览卡 快捷模板 今日场次 Grid(可选/已选/已满三态&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…