QtDumpTest

QT程序生成Dump文件

作者
WildPointer
更新
2025-05-02
类型
自有项目
仓库
0 stars / 0 forks(抓取快照)

QtDumpTest

QT程序生成Dump文件

语言组成

C++
97.7%
C
2.3%

文件结构

查看完整文件清单(11 个文件)
QtDumpTest.sln
QtDumpTest/QtDumpTest.cpp
QtDumpTest/QtDumpTest.h
QtDumpTest/QtDumpTest.qrc
QtDumpTest/QtDumpTest.ui
QtDumpTest/QtDumpTest.vcxproj
QtDumpTest/QtDumpTest.vcxproj.filters
QtDumpTest/dump.cpp
QtDumpTest/dump.h
QtDumpTest/main.cpp
README.md

关键源码

QtDumpTest/dump.h
QtDumpTest/dump.h
#pragma once// dump.h#include <windows.h>extern LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo);
QtDumpTest/dump.cpp
QtDumpTest/dump.cpp
// dump.cpp#include <stdio.h>#include <windows.h>#include <dbghelp.h>#include <stdlib.h>#pragma comment(lib, "Dbghelp.lib")#include <DbgHelp.h>/*  生成MiniDump文件的核心函数*   hFile:指定已有文件    pExceptionPointers:异常信息指针    pwAppName:应用程序名称*/int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName){    HANDLE hDumpFile = hFile;   //使用的文件	BOOL bOwnDumpFile = FALSE;  //是否创建了文件	MINIDUMP_EXCEPTION_INFORMATION ExpParam;    //异常信息结构	typedef BOOL(WINAPI* MiniDumpWriteDumpT)(		HANDLE,		DWORD,		HANDLE,		MINIDUMP_TYPE,		PMINIDUMP_EXCEPTION_INFORMATION,		PMINIDUMP_USER_STREAM_INFORMATION,		PMINIDUMP_CALLBACK_INFORMATION		);	MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;	HMODULE hDbgHelp = LoadLibrary("DbgHelp.dll");    if (hDbgHelp) {        pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");    }	if (pfnMiniDumpWriteDump){        //创建新的转储文件		if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)		{			TCHAR szFileName[MAX_PATH] = { 0 }; //文件名			TCHAR dwBufferSize = MAX_PATH;      //缓冲区大小			SYSTEMTIME stLocalTime;             //本地时间			GetLocalTime(&stLocalTime);			CreateDirectory(szFileName, NULL);            //生成带时间戳和进程信息的文件名			wsprintf(szFileName, "%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",				"v1.0",				stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,				stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,				GetCurrentProcessId(), GetCurrentThreadId());            //创建转储文件			hDumpFile = CreateFile(szFileName,                GENERIC_READ | GENERIC_WRITE,       //读写权限				FILE_SHARE_WRITE | FILE_SHARE_READ, //共享模式                0,              //安全属性                CREATE_ALWAYS,  //总是创建新文件                0,              //文件属性                0);             //模板文件			bOwnDumpFile = TRUE;			OutputDebugString(szFileName);		}		//写入转储文件		if (hDumpFile != INVALID_HANDLE_VALUE){			//设置异常信息			ExpParam.ThreadId = GetCurrentThreadId();			ExpParam.ExceptionPointers = pExceptionPointers;			ExpParam.ClientPointers = FALSE;			//调用dump生成函数			pfnMiniDumpWriteDump(GetCurrentProcess(),	//当前进程				GetCurrentProcessId(),					//进程ID				hDumpFile,								//文件句柄				MiniDumpWithDataSegs,					//转储类型				(pExceptionPointers ? &ExpParam : NULL),//异常信息				NULL,									//用户流信息				NULL);									//回调信息			if (bOwnDumpFile) {				CloseHandle(hDumpFile);			}		}	}	//清理资源	if (hDbgHelp != NULL) {		FreeLibrary(hDbgHelp);	}	return EXCEPTION_EXECUTE_HANDLER;}/*	顶层异常过滤器函数*	lpExceptionInfo:异常信息指针*/LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo){	//如果调试器存在,继续搜索异常处理程序	if (IsDebuggerPresent()){		return EXCEPTION_CONTINUE_SEARCH;	}	return GenerateMiniDump(NULL, lpExceptionInfo, PWCHAR("test"));}
QtDumpTest/main.cpp
QtDumpTest/main.cpp
#include "QtDumpTest.h"#include "dump.h"  #include <QtWidgets/QApplication>int main(int argc, char *argv[]){    ::SetUnhandledExceptionFilter(ExceptionFilter);    QApplication a(argc, argv);    QtDumpTest w;    w.show();    return a.exec();}
WildPointer

专注系统编程、工程实践与底层技术,记录 C++、Qt、OpenCV 与 VTK 的学习和实践。