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文件拖入: