qt应用程序崩溃日志和转储dmp文件对于定位问题
qt应用程序崩溃日志和转储文件对于定位问题
- 一. DMP 文件包含的信息:
- 二. 分析 DMP 文件的主要方法:
- 三. 生成更详细的 DMP 文件:
- 四. 分析 DMP 文件的注意事项:
- 五. 实用建议:
- 六. 实战
一. DMP 文件包含的信息:
1崩溃时的调用堆栈
2内存状态
3寄存器值
4线程信息
5加载的模块信息
6系统信息
DMP(转储)文件记录了程序崩溃时的完整内存状态,对于分析崩溃原因非常有用。以下是关于 DMP 文件的详细说明:
二. 分析 DMP 文件的主要方法:
一. 使用 Visual Studio 分析
- 打开 Visual Studio
- 文件 -> 打开 -> 文件 -> 选择 .dmp 文件
- 在调试器中设置符号路径(必须有对应的 PDB 文件)
- 点击"调试"按钮开始分析
二.使用 WinDbg 分析
基本命令:
!analyze -v # 详细分析崩溃原因
k # 显示调用堆栈
~*k # 显示所有线程的调用堆栈
!threads # 显示线程信息
lm # 显示加载的模块
三. 生成更详细的 DMP 文件:
MINIDUMP_TYPE dumpType = (MINIDUMP_TYPE)(
MiniDumpNormal | // 基本信息
MiniDumpWithFullMemory | // 完整内存
MiniDumpWithHandleData | // 句柄数据
MiniDumpWithThreadInfo | // 线程信息
MiniDumpWithProcessThreadData // 进程线程数据
);
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hDumpFile,
dumpType, // 使用更详细的转储类型
&dumpInfo,
NULL,
NULL
);
四. 分析 DMP 文件的注意事项:
1需要符号文件(PDB)
- 确保保存了程序的 PDB 文件
- PDB 文件版本必须与崩溃程序版本一致
- 设置正确的符号路径
2发布版本的准备工作
// 在 .pro 文件中添加
QMAKE_CXXFLAGS_RELEASE += /Zi # 生成调试信息
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF # 链接时包含调试信息
3常见崩溃原因分析:
- 访问违例(空指针)
- 内存损坏
- 栈溢出
- 非法内存访问
- 未处理的异常
五. 实用建议:
1.建立版本管理
- 保存每个发布版本的源码
- 保存对应的 PDB 文件
- 记录版本号和编译时间
2.添加额外信息
// 在生成 DMP 时添加自定义数据
MINIDUMP_USER_STREAM_INFORMATION userStreamInfo;
MINIDUMP_USER_STREAM userStream;
QString extraInfo = “Version: 1.0.0; Build: Debug”;
userStream.Type = CustomStreamType;
userStream.Buffer = (void*)extraInfo.toUtf8().data();
userStream.BufferSize = extraInfo.length();
userStreamInfo.UserStreamCount = 1;
userStreamInfo.UserStreamArray = &userStream;
通过正确分析 DMP 文件,你可以:
1确定崩溃的具体位置
2了解崩溃时的程序状态
3查看相关变量的值
4追踪问题的根源
这些信息对于修复程序问题非常重要,特别是在无法直接重现问题的情况下。
六. 实战
下面展示一个会崩溃的 Qt 程序示例,并说明如何生成和分析 DMP 文件。
1. 示例程序
// main.cpp
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QDebug>
#include <windows.h>
#include <dbghelp.h>
#include <QDateTime>// DMP文件生成函数
LONG WINAPI createMiniDump(EXCEPTION_POINTERS* pExp)
{QString dumpPath = QCoreApplication::applicationDirPath() + "/crash_" + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss") + ".dmp";HANDLE hDumpFile = CreateFileW(dumpPath.toStdWString().c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hDumpFile != INVALID_HANDLE_VALUE) {MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ExceptionPointers = pExp;dumpInfo.ThreadId = GetCurrentThreadId();dumpInfo.ClientPointers = TRUE;// 生成更详细的DMP文件MINIDUMP_TYPE dumpType = (MINIDUMP_TYPE)(MiniDumpNormal |MiniDumpWithFullMemory |MiniDumpWithHandleData |MiniDumpWithThreadInfo |MiniDumpWithProcessThreadData);MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hDumpFile,dumpType,&dumpInfo,NULL,NULL);CloseHandle(hDumpFile);}return EXCEPTION_EXECUTE_HANDLER;
}// 故意制造崩溃的类
class CrashTest : public QMainWindow
{
public:CrashTest(){QPushButton* btn = new QPushButton("点击崩溃", this);setCentralWidget(btn);connect(btn, &QPushButton::clicked, this, &CrashTest::makeCrash);resize(200, 100);}void makeCrash(){// 方式1:空指针访问int* p = nullptr;*p = 100;// 方式2:数组越界// int arr[5];// arr[1000000] = 1;// 方式3:除零错误// int a = 0;// int b = 100 / a;}
};int main(int argc, char *argv[])
{// 设置异常处理函数SetUnhandledExceptionFilter(createMiniDump);QApplication a(argc, argv);CrashTest w;w.show();return a.exec();
}
2. 项目文件配置
# crash_test.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17
CONFIG += force_debug_info # 强制生成调试信息SOURCES += main.cpp# 添加 dbghelp 库
LIBS += -ldbghelp# 生成PDB文件的配置
QMAKE_CXXFLAGS_RELEASE += /Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF
3. 编译和运行步骤
1.使用 Qt Creator 打开项目
2.选择 Release 模式编译
3.运行程序
4.点击"点击崩溃"按钮
5.程序会崩溃并在程序目录生成 .dmp 文件
4. DMP 文件分析步骤
1.使用 Visual Studio 分析
- 打开 Visual Studio
- 文件 -> 打开 -> 文件 -> 选择生成的 .dmp 文件
- 在"解决方案资源管理器"中设置符号路径:
- 工具 -> 选项 -> 调试 -> 符号
- 添加包含 PDB 文件的文件夹路径
- 点击"调试"按钮
- Visual Studio 会显示崩溃位置和调用堆栈
2.使用 WinDbg 分析
- 打开 WinDbg
- 文件 -> 打开崩溃转储
- 设置符号路径:.sympath+ [PDB文件路径]
- 输入命令:
!analyze -v # 查看详细崩溃信息
k # 查看调用堆栈
~*k # 查看所有线程的调用堆栈
5. 预期结果
在这个示例中,程序会因为空指针访问而崩溃。分析 DMP 文件时,你应该能看到:
1崩溃发生在 makeCrash() 函数中
2异常类型为访问违例(Access Violation)
3调用堆栈会显示从按钮点击到崩溃的完整路径
6. 注意事项
1确保保存了 PDB 文件
2Release 模式下也要生成调试信息
3分析时需要对应版本的源代码
4符号路径设置正确
这个例程提供了一个完整的崩溃捕获和分析流程。你可以通过修改 makeCrash() 函数来测试不同类型的崩溃情况。
完整项目我链接:qt-dmp
如果程序崩溃不容易复现难以短时间定位解决,希望崩溃后自动拉起进程,有几种方案可供选择。文章有点长,我会放在下一篇中介绍。
相关文章:
qt应用程序崩溃日志和转储dmp文件对于定位问题
qt应用程序崩溃日志和转储文件对于定位问题 一. DMP 文件包含的信息:二. 分析 DMP 文件的主要方法:三. 生成更详细的 DMP 文件:四. 分析 DMP 文件的注意事项:五. 实用建议:六. 实战 一. DMP 文件包含的信息:…...
Mysql架构
连接层 最上层是一些客户端和连接服务,负责客户端的连接,验证账号密码等授权认证 服务层 主要完成大多数的核心服务功能,对sql进行解析,优化,调用函数,如果是查询操作,有没有缓存等操作操作。所…...
杂发单的单据类型一个参数的逻辑
【核准中可改】被产线滥用了。它们可以这样做,开立一张杂发单,打印出来交领导层签名。单据要交财务做核算的。然后去修改杂发单的材料。以为可以瞒天过海。2个仓库,一个中掉坑里,一个发现了它们的拙劣的手段,上报之后没…...
Linux系统 vim 编辑文件搜索关键字用法
1、首先确保在normal模式下,按ESC后不在insert模式 输入 /test或?test 此时就会匹配 test 字符串,并且高亮显示 2、向前搜索 /字符串:按n匹配下一个目标,按N匹配上一个目标 3、向后搜索 ?字符串:按n匹配上一个目标…...
Vue智慧商城项目
创建项目 vue组件库 — vant-ui(常用于移动端) Vant 2 - 轻量、可靠的移动端组件库 安装vant npm i vantlatest-v2 -S 引入组件 按需导入和全部导入 全部导入 整个组件库的所有组件都导进来,缺点是增加了代码包体积 main.js import…...
Qt Window应用程序去掉控制台窗口
Qt Window应用程序去掉控制台窗口 方式一 set(PROJECT_SOURCESWIN32main.cppmainwindow.hpp )add_executable(Tool-V2${PROJECT_SOURCES} )方式二 set_target_properties(Tool-V2 PROPERTIESMACOSX_BUNDLE TRUEWIN32_EXECUTABLE TRUE )参考文献: cmake Qt 项目…...
软件测试最新项目合集【商城、外卖、银行、金融等等.......】
项目一:ShopNC商城 项目概况: ShopNC商城是一个电子商务B2C电商平台系统,功能强大,安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城,系统PC后台是基于ThinkPHP MVC构架开发的跨…...
SAP SD学习笔记18 - 投诉处理4 - 请求书订正依赖,投诉处理流程的总结
上一章讲了 Credit/Debit Memo依赖,Credit/Debit Memo。Credit Memo依赖 本质上是一张受注票;Credit Memo 本质上是一张请求票。 SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo-CSDN博客 本章继续讲本图中的内容…...
VBA批量提取PDF内容的程序
VBA批量提取PDF内容的程序 Sub ExtractPDFText()Dim pdfApp As Acrobat.AcroAppDim pdfDoc As Acrobat.CAcroPDDocDim pdfPage As Acrobat.AcroPDPageDim txtData As StringDim i As IntegerDim filePath As StringDim outputFolder As StringDim outputFileName As String 初…...
C++入门终
目录 一、引用 二、内联函数 三、auto关键字 四、指针空值nullptr 一、引用 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间 类型&引用变量名(对象名)…...
ubuntu下Qt5自动编译配置QtMqtt环境(10)
文章目录 [toc]1、概述2、下载QtMqtt源码3、编译4、验证5、参考6、视频 更多精彩内容👉内容导航 👈👉Qt网络编程 👈 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配置; 网络所有的…...
Vulnhub DC-3靶机攻击实战(一)
导语 在之前的博客分享中,我们介绍了关于如何获取DC-1和DC-2机器的所有的Flag,下面我们来介绍一下如何对DC-3靶机进行渗透测试。 第一步、搭建靶机环境 下载靶机,并且将靶机导入到VMware环境中,如下所示。 第二步、收集服务器信息 进入到Kali攻击机之后,打开root权限…...
常用传感器介绍合集
SW-520D倾斜传感器 HX711模块:高精度称重的核心利器 GY302光照传感器模块详解 MLX90614红外测温传感器介绍 MAX30102心率血氧传感器模块:精准健康监测的利器 RGB颜色传感器简介 DS18B20温度传感器模块 人体红外传感器简介 FC-28土壤湿度传感器 …...
“为您的家电穿上防震铠甲:优质电器缓冲器
在地震频发地区或日常生活中,确保家电的安全和稳定至关重要。为了防止地震、意外碰撞或其他外力对家电造成损害,采用优质的电器缓冲器就像是为家电穿上了一层坚固的“防震铠甲”。这不仅能够有效减少因震动导致的损坏风险,还能显著延长家电的…...
Elasticsearch入门之HTTP高级查询操作
前言 上一篇博客我们学习了es的一些基础操作如下: 创建索引(创建表 create table)查看索引(查看表show tables)查看单个索引(查看单个表show create table)删除索引(删除表&#x…...
Java基础-异常
异常 什么是异常 在实际工作中,遇到的情况不可能是非常完美的。比如:你写一个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据…...
鲲鹏麒麟使用Docker部署Redis5
本次部署采用Docker方式进行部署,服务器为鲲鹏服务器,CPU架构为ARM64,操作系统版本信息为 # cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)镜像 下载镜像鲲鹏麒麟Redis5镜像包 部署 1、上传镜像到服务器 2、…...
家政项目小程序+ssm
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序家政项目小程序的开发全过程。通过分析微信小程序家政项目小程序管理的不足,创建了一个计算机管理微信小程序家政项目小程序的方案。文章…...
Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车
目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…...
天天 AI-241207:今日热点- Windsurf:在工程能力上进一步进化的Cursor
2AGI.NET | 探索 AI 无限潜力,2AGI 为您带来最前沿资讯。 Windsurf:在工程能力上进一步进化的Cursor 介绍了一个新的AI代码编辑器Windsurf,它被认为是Cursor的进化版,具有更强的工程能力。文章强调了Windsurf在自动化编码和系统…...
视频内容自动打标:基于Emotion2Vec+ Large的语音情绪分析方案
视频内容自动打标:基于Emotion2Vec Large的语音情绪分析方案 1. 引言:语音情绪分析在视频内容管理中的价值 在视频内容爆炸式增长的今天,如何高效管理和检索海量视频素材成为内容平台面临的重大挑战。传统的人工打标方式不仅效率低下&#…...
解决数字记忆碎片化的创新方案:GetQzonehistory让社交数据成为可触摸的时光胶囊
解决数字记忆碎片化的创新方案:GetQzonehistory让社交数据成为可触摸的时光胶囊 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 副标题:重构QQ空间回忆的3大突破…...
在macOS上利用PyInstaller为Windows生成exe文件的3种实用方法
1. 为什么macOS不能直接生成Windows的exe文件? 很多刚开始接触Python打包的开发者都会遇到一个头疼的问题:明明在macOS上写好的脚本,用PyInstaller打包后却不能在Windows电脑上运行。这其实和PyInstaller的工作原理有关——它需要访问目标平…...
GPT-Neo终极指南:从预训练模型到高效文本生成的完整实践
GPT-Neo终极指南:从预训练模型到高效文本生成的完整实践 【免费下载链接】gpt-neo An implementation of model parallel GPT-2 and GPT-3-style models using the mesh-tensorflow library. 项目地址: https://gitcode.com/gh_mirrors/gp/gpt-neo GPT-Neo是…...
网盘直链获取工具:高效解析与实用指南
网盘直链获取工具:高效解析与实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广,无需输入…...
Cardano节点高级功能探索:质押池、智能合约与治理的终极指南
Cardano节点高级功能探索:质押池、智能合约与治理的终极指南 【免费下载链接】cardano-node The core component that is used to participate in a Cardano decentralised blockchain. 项目地址: https://gitcode.com/gh_mirrors/ca/cardano-node Cardano节…...
智能家居系统部署终极指南:5分钟搞定全流程配置
智能家居系统部署终极指南:5分钟搞定全流程配置 【免费下载链接】operating-system :beginner: Home Assistant Operating System 项目地址: https://gitcode.com/gh_mirrors/op/operating-system Home Assistant Operating System(原HassOS&…...
原创:华为大模型万卡训推一体破局方案
华为大模型万卡训推一体破局方案 作者:华夏之光永存 摘要:本文针对华为昇腾大模型算力集群面临的训推割裂、生态适配成本高、HBM显存被卡脖子、内部多部门对齐困难、客户规模化部署账算不清等行业核心痛点,提出一套先锁决策、再建架构、最后落…...
如何让零基础快速掌握3D资产生成:颠覆式AI工具Hunyuan3D-2实战指南
如何让零基础快速掌握3D资产生成:颠覆式AI工具Hunyuan3D-2实战指南 【免费下载链接】Hunyuan3D-2 High-Resolution 3D Assets Generation with Large Scale Hunyuan3D Diffusion Models. 项目地址: https://gitcode.com/GitHub_Trending/hu/Hunyuan3D-2 技术…...
MATLAB实战:如何用最小二乘法搞定系统辨识(附完整代码)
MATLAB实战:最小二乘法在系统辨识中的工程应用指南 在工业控制、信号处理等领域,系统辨识是建立数学模型的关键步骤。想象一下,当你面对一组输入输出数据,却不知道背后的系统规律时,最小二乘法就像一把瑞士军刀&#x…...
