VC++ Dump文件生成

头文件定义(CSWMinidump.h)

#ifndef CSW_MINIDUMP_HEAD_FILE
#define CSW_MINIDUMP_HEAD_FILE

#pragma once
#include <dbgHelp.h>
#pragma comment(lib, "dbghelp.lib")

namespace sw {
	namespace Minidump {

		// 启用程序异常崩溃捕获
		void SetUnhandledExceptionFilter();

	}
}

#endif

源码实现(CSWMinidump.cpp)

#include "pch.h"
#include "CSWMinidump.h"

namespace sw {
	namespace Minidump {
		void AFX_CDECL WriteCrashDumpFile(_EXCEPTION_POINTERS* pExInfo, _MINIDUMP_TYPE WriteFlag)
		{
			// WinDbg
			// analyze -v 自动分析
			// .ecxr  转到源码
			if (pExInfo == NULL)
				RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);

			char lpszModuleFilePath[MAX_PATH];
			GetModuleFileName(NULL, lpszModuleFilePath, MAX_PATH);
			(_tcsrchr(lpszModuleFilePath, '.'))[0] = 0;
			strcat_s(lpszModuleFilePath, _T(".dmp"));

			MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
			dumpInfo.ThreadId = ::GetCurrentThreadId();
			dumpInfo.ExceptionPointers = pExInfo;
			dumpInfo.ClientPointers = TRUE;
			HANDLE hCrashFile = ::CreateFile(lpszModuleFilePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if (hCrashFile != INVALID_HANDLE_VALUE)
			{
				BOOL bWrite = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hCrashFile, WriteFlag, &dumpInfo, NULL, NULL);
				if (bWrite)
					::FlushFileBuffers(hCrashFile);
			}

			CloseHandle(hCrashFile);
			hCrashFile = NULL;
		}

		LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS* lpExceptionInfo)
		{
			WriteCrashDumpFile(lpExceptionInfo, MiniDumpWithFullMemory);
			return EXCEPTION_EXECUTE_HANDLER;
		}

		void SetUnhandledExceptionFilter()
		{
			SetUnhandledExceptionFilter(UnhandledExceptionFilter);
		}
	}
}

在程序的入口函数部分调用sw::Minidump::SetUnhandledExceptionFilter()。程序异常崩溃,即可在当前目录下生成和应用程序名称一样的dmp文件。如:a.exe -> a.dmp。

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/106195823