Qt使用dump文件记录并查找软件奔溃信息详细教程

Qt使用dump文件记录并查找软件奔溃信息

一、dump文件概述

1、dump文件的基本概念

dump文件通常指系统或程序在异常状态下生成的转储文件,用于记录内存、寄存器、堆栈等关键信息。常见于系统崩溃(如Windows蓝屏)或应用程序故障时自动生成,帮助开发者分析问题根源。

2、dump文件的常见类型

核心dump(Core Dump) :Unix/Linux系统在程序崩溃时生成,包含进程的内存状态。默认路径为/core或/var/crash。
内存转储文件(Memory Dump):Windows系统分为:

  • 小型转储(Minidump) :仅保存关键错误信息,路径为%SystemRoot%\Minidump。
  • 完全转储(Complete Memory Dump) :保存全部物理内存内容,路径为%SystemRoot%\MEMORY.DMP。

3、dump文件的分析工具

Windows平台:

  • WinDbg:微软官方调试工具,支持分析蓝屏dump文件。
  • BlueScreenView:可视化工具,快速定位崩溃驱动。

Linux平台:

  • GDB :通过gdb <程序> <core文件>命令调试。
  • Crash:专用于内核转储分析,需安装内核调试符号。

4、dump文件的应用场景

  • 调试崩溃问题:通过堆栈回溯定位异常代码位置。
  • 内存泄漏分析 :检查内存分配记录(如Windows的!heap命令)。
  • 恶意软件分析:提取进程内存中的可疑代码片段。

二、具体实现步骤

1、下载dbghelp库

在文章顶部下载

2、将库添加到自己的工程中

将下载的库文件放到工程目录下

添加到自己的工程中


此时就OK了。

3、main.cpp添加代码记录奔溃日志

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>
#include <QDir>
#include <QMessageBox>


#ifdef Q_OS_WIN
#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")

LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    QString logFile = QApplication::applicationDirPath() + "/Log";
    if (!QDir(logFile).exists())
    {
        QDir().mkdir(logFile);
    }

    QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyy_MM_dd hh_mm_ss"));
    HANDLE hDumpFile = CreateFileW(dumpName.toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ExceptionPointers = ExceptionInfo;
        dumpInfo.ClientPointers = TRUE;

        // 创建Dump文件
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, ExceptionInfo ? &dumpInfo : nullptr, nullptr, nullptr);
        CloseHandle(hDumpFile);
    }

    // 提示
    QMessageBox::critical(nullptr, QString("Application Error"), QString("Application is Crash!"), QMessageBox::Ok);
    return EXCEPTION_EXECUTE_HANDLER;
}
#endif
int main(int argc, char *argv[])
{
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)AppExceptionCallback);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

4、编写测试代码

mainWindow.ui文件中放置 一个按钮,然后转到槽

然后编写测试代码:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    int a=10/0;
    qDebug()<<a;
}

让被除数等于0.

5、测试

点击按钮程序就会奔溃

查找奔溃日志

此时log文件下就会存在dump文件

6、结果查看

打开Visual Studio直接将dump文件拖入:

相关推荐
wangchunyu11426 分钟前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶1 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子2 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放2 小时前
面向对象高级(实战案例)
开发语言·python·学习
fanruitian3 小时前
python else用法
开发语言·python
FRing033 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿3 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_417396834 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
某不知名網友4 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
java_nnnn5 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode