头文件定义(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。