windows 创建dump文件
使用windows,创建c++ dump文件
#include <windows.h>
#include <DbgHelp.h>
#include <QCoreApplication>
#include <QDebug>
#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
// 链接DbgHelp库,注意在工程中加入DbgHelp.lib
#pragma comment(lib, "Dbghelp.lib")
// 定义 Dump 文件生成函数
LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* pExceptionPointers)
{
// 构造 Dump 文件名,使用当前进程ID或时间戳来唯一标识
TCHAR dumpPath[MAX_PATH] = { 0 };
GetModuleFileName(NULL, dumpPath, MAX_PATH);
// 可以根据需要修改dump文件名,这里简单示例
TCHAR dumpFileName[MAX_PATH] = TEXT("CrashDumpMW.dmp");
HANDLE hFile = CreateFile(dumpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// 设置 Dump 信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ExceptionPointers = pExceptionPointers;
dumpInfo.ClientPointers = FALSE;
// 生成 Dump 文件,MiniDumpNormal 为基本信息级别
BOOL success = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,
MiniDumpNormal, &dumpInfo, NULL, NULL);
if (success)
{
qDebug() << "Dump file created successfully.";
}
else
{
qDebug() << "Failed to create dump file.";
}
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//QtWidgetsApplication1 w;
//w.show();
// 安装全局未捕获异常处理器
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
// 模拟崩溃,可用于测试dump生成
int *p = nullptr;
*p = 42; // 强制产生崩溃
// 正常启动程序
qDebug() << "Application started.";
return a.exec();
}