Qt使用dump文件记录并查找软件奔溃信息
- 一、dump文件概述
- 1、dump文件的基本概念
- 2、dump文件的常见类型
- 3、dump文件的分析工具
- 4、dump文件的应用场景
- 二、具体实现步骤
- 1、下载dbghelp库
- 2、将库添加到自己的工程中
- 3、main.cpp添加代码记录奔溃日志
- 4、编写测试代码
- 5、测试
- 6、结果查看
一、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添加代码记录奔溃日志
#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文件中放置 一个按钮,然后转到槽
然后编写测试代码:
void MainWindow::on_pushButton_clicked()
{int a=10/0;qDebug()<<a;
}
让被除数等于0.
5、测试
点击按钮程序就会奔溃
查找奔溃日志
此时log文件下就会存在dump文件
6、结果查看
打开Visual Studio直接将dump文件拖入: