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

qt应用程序崩溃日志和转储dmp文件对于定位问题

qt应用程序崩溃日志和转储文件对于定位问题

  • 一. DMP 文件包含的信息:
  • 二. 分析 DMP 文件的主要方法:
  • 三. 生成更详细的 DMP 文件:
  • 四. 分析 DMP 文件的注意事项:
  • 五. 实用建议:
  • 六. 实战

一. DMP 文件包含的信息:

1崩溃时的调用堆栈
2内存状态
3寄存器值
4线程信息
5加载的模块信息
6系统信息
DMP(转储)文件记录了程序崩溃时的完整内存状态,对于分析崩溃原因非常有用。以下是关于 DMP 文件的详细说明:

二. 分析 DMP 文件的主要方法:

一. 使用 Visual Studio 分析

  1. 打开 Visual Studio
  2. 文件 -> 打开 -> 文件 -> 选择 .dmp 文件
  3. 在调试器中设置符号路径(必须有对应的 PDB 文件)
  4. 点击"调试"按钮开始分析

二.使用 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 分析

  1. 打开 Visual Studio
  2. 文件 -> 打开 -> 文件 -> 选择生成的 .dmp 文件
  3. 在"解决方案资源管理器"中设置符号路径:
    • 工具 -> 选项 -> 调试 -> 符号
    • 添加包含 PDB 文件的文件夹路径
  4. 点击"调试"按钮
  5. Visual Studio 会显示崩溃位置和调用堆栈

2.使用 WinDbg 分析

  1. 打开 WinDbg
  2. 文件 -> 打开崩溃转储
  3. 设置符号路径:.sympath+ [PDB文件路径]
  4. 输入命令:
    !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 文件包含的信息&#xff1a;二. 分析 DMP 文件的主要方法&#xff1a;三. 生成更详细的 DMP 文件&#xff1a;四. 分析 DMP 文件的注意事项&#xff1a;五. 实用建议&#xff1a;六. 实战 一. DMP 文件包含的信息&#xff1a…...

Mysql架构

连接层 最上层是一些客户端和连接服务&#xff0c;负责客户端的连接&#xff0c;验证账号密码等授权认证 服务层 主要完成大多数的核心服务功能&#xff0c;对sql进行解析&#xff0c;优化&#xff0c;调用函数&#xff0c;如果是查询操作&#xff0c;有没有缓存等操作操作。所…...

杂发单的单据类型一个参数的逻辑

【核准中可改】被产线滥用了。它们可以这样做&#xff0c;开立一张杂发单&#xff0c;打印出来交领导层签名。单据要交财务做核算的。然后去修改杂发单的材料。以为可以瞒天过海。2个仓库&#xff0c;一个中掉坑里&#xff0c;一个发现了它们的拙劣的手段&#xff0c;上报之后没…...

Linux系统 vim 编辑文件搜索关键字用法

1、首先确保在normal模式下&#xff0c;按ESC后不在insert模式 输入 /test或?test 此时就会匹配 test 字符串&#xff0c;并且高亮显示 2、向前搜索 /字符串&#xff1a;按n匹配下一个目标&#xff0c;按N匹配上一个目标 3、向后搜索 ?字符串&#xff1a;按n匹配上一个目标…...

Vue智慧商城项目

创建项目 vue组件库 — vant-ui&#xff08;常用于移动端&#xff09; Vant 2 - 轻量、可靠的移动端组件库 安装vant npm i vantlatest-v2 -S 引入组件 按需导入和全部导入 全部导入 整个组件库的所有组件都导进来&#xff0c;缺点是增加了代码包体积 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 )参考文献&#xff1a; cmake Qt 项目…...

软件测试最新项目合集【商城、外卖、银行、金融等等.......】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…...

SAP SD学习笔记18 - 投诉处理4 - 请求书订正依赖,投诉处理流程的总结

上一章讲了 Credit/Debit Memo依赖&#xff0c;Credit/Debit Memo。Credit Memo依赖 本质上是一张受注票&#xff1b;Credit Memo 本质上是一张请求票。 SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖&#xff0c;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 一、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 类型&引用变量名(对象名)…...

ubuntu下Qt5自动编译配置QtMqtt环境(10)

文章目录 [toc]1、概述2、下载QtMqtt源码3、编译4、验证5、参考6、视频 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt网络编程 &#x1f448; 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配置&#xff1b; 网络所有的…...

Vulnhub DC-3靶机攻击实战(一)

导语   在之前的博客分享中,我们介绍了关于如何获取DC-1和DC-2机器的所有的Flag,下面我们来介绍一下如何对DC-3靶机进行渗透测试。 第一步、搭建靶机环境 下载靶机,并且将靶机导入到VMware环境中,如下所示。 第二步、收集服务器信息 进入到Kali攻击机之后,打开root权限…...

常用传感器介绍合集

SW-520D倾斜传感器 HX711模块&#xff1a;高精度称重的核心利器 GY302光照传感器模块详解 MLX90614红外测温传感器介绍 MAX30102心率血氧传感器模块&#xff1a;精准健康监测的利器 RGB颜色传感器简介 DS18B20温度传感器模块 人体红外传感器简介 FC-28土壤湿度传感器 …...

“为您的家电穿上防震铠甲:优质电器缓冲器

在地震频发地区或日常生活中&#xff0c;确保家电的安全和稳定至关重要。为了防止地震、意外碰撞或其他外力对家电造成损害&#xff0c;采用优质的电器缓冲器就像是为家电穿上了一层坚固的“防震铠甲”。这不仅能够有效减少因震动导致的损坏风险&#xff0c;还能显著延长家电的…...

Elasticsearch入门之HTTP高级查询操作

前言 上一篇博客我们学习了es的一些基础操作如下&#xff1a; 创建索引&#xff08;创建表 create table&#xff09;查看索引&#xff08;查看表show tables&#xff09;查看单个索引&#xff08;查看单个表show create table&#xff09;删除索引&#xff08;删除表&#x…...

Java基础-异常

异常 什么是异常 在实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写一个模块&#xff0c;用户输入不一定符合你的要求、你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff0c;你要读取数据库的数据&#xff0c;数据…...

鲲鹏麒麟使用Docker部署Redis5

本次部署采用Docker方式进行部署&#xff0c;服务器为鲲鹏服务器&#xff0c;CPU架构为ARM64&#xff0c;操作系统版本信息为 # cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)镜像 下载镜像鲲鹏麒麟Redis5镜像包 部署 1、上传镜像到服务器 2、…...

家政项目小程序+ssm

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序家政项目小程序的开发全过程。通过分析微信小程序家政项目小程序管理的不足&#xff0c;创建了一个计算机管理微信小程序家政项目小程序的方案。文章…...

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 无限潜力&#xff0c;2AGI 为您带来最前沿资讯。 Windsurf&#xff1a;在工程能力上进一步进化的Cursor 介绍了一个新的AI代码编辑器Windsurf&#xff0c;它被认为是Cursor的进化版&#xff0c;具有更强的工程能力。文章强调了Windsurf在自动化编码和系统…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...