当前位置: 首页 > 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在自动化编码和系统…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...