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

发布时间:2026/11/2 3:27:58

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/10/28 6:49:52

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

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

2026/10/28 11:12:40

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

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

2026/11/2 3:24:57

AI通话实时可控:强插与强制挂断的底层实现原理

1. 这不是“加个按钮”那么简单:人工强插与强制挂断背后的真实战场SmartCall 1.0.6 这次更新,表面看只是在通话界面上多了两个按钮——“人工介入”和“强制结束”。但如果你真以为这只是前端UI加两行代码、后端加两个API接口,那我得说&#…

2026/11/2 3:24:57

深度学习重塑语音降噪:从频谱掩蔽到端到端模型

上篇我聊了语音降噪从模拟滤波一路走到谱减法、维纳滤波、MMSE 估计、子空间分解这段历史,那些方法今天还在各种嵌入式设备和开源库里服役,但它们的“天花板”也确实明显。这篇《语音降噪风雨六十载(下)》接着往下讲——深度学习如…

2026/11/2 3:24:57

智能仓储技术解析:从物联网到AI调度的转型实践

1. 仓库管理现状与痛点剖析"人找货"模式是当前许多中小型仓库普遍存在的低效作业方式。在这种模式下,仓库管理员需要凭借记忆或纸质单据在货架间来回穿梭寻找目标商品,整个过程存在三大典型问题:首先是路径规划不合理。我们曾实测过…

2026/11/2 3:19:56

Kong网关限流实战:从原理到生产环境优化

1. 为什么需要网关限流?从一次线上事故说起去年双十一大促期间,我们的Hzero平台遭遇了一次严重的服务雪崩。当时某个核心接口的QPS突然飙升到平时的50倍,直接导致整个集群崩溃。事后分析发现,由于前端没有做请求过滤,加…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑