用到dbghelp.lib和dbghelp.dll文件,生成minidump文件,直接看代码:
#include <iostream>
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "dbghelp.lib")
static LONG WINAPI pfnUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}
typedef BOOL(WINAPI* MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION);
HMODULE hDbgHelp = LoadLibrary("dbghelp.dll");
if (NULL == hDbgHelp)
{
return EXCEPTION_CONTINUE_EXECUTION;
}
SYSTEMTIME stSysTime;
memset(&stSysTime, 0, sizeof(SYSTEMTIME));
GetLocalTime(&stSysTime);
TCHAR szFile[MAX_PATH] = { 0 }; //根据字符集,有时候可能为WCHAR
wsprintf(szFile, "%0.4d-%0.2d-%0.2d-%0.2d-%0.2d-%0.2d-%0.3d.dmp",\
stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay, stSysTime.wHour,\
stSysTime.wMinute, stSysTime.wSecond, stSysTime.wMilliseconds);
HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,\
0, CREATE_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE != hFile)
{
MINIDUMP_EXCEPTION_INFORMATION objExInfo;
objExInfo.ThreadId = ::GetCurrentThreadId();
objExInfo.ExceptionPointers = pExceptionInfo;
objExInfo.ClientPointers = NULL;
BOOL bOk = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\
MiniDumpWithDataSegs, (pExceptionInfo ? &objExInfo : NULL), NULL, NULL);
CloseHandle(hFile);
}
FreeLibrary(hDbgHelp);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char** argv)
{
SetUnhandledExceptionFilter(pfnUnhandledExceptionFilter);
int* pTest = NULL;
*pTest = 1;
char* pFileName = "./test.txt";
WCHAR wszFileName[MAX_PATH] = { 0 };
MultiByteToWideChar(CP_ACP, 0, pFileName, strlen(pFileName) + 1, wszFileName, sizeof(wszFileName) / sizeof(wszFileName[0]));
getchar();
return 0;
}
另外一种做法:
#include <iostream>
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "dbghelp.lib")
static LONG WINAPI pfnUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}
typedef BOOL(WINAPI* MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION);
HMODULE hDbgHelp = LoadLibrary("dbghelp.dll");
if (NULL == hDbgHelp)
{
return EXCEPTION_CONTINUE_EXECUTION;
}
MiniDumpWriteDumpT pfnMinidumpWriteDump = NULL;
pfnMinidumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if (NULL == pfnMinidumpWriteDump)
{
FreeLibrary(hDbgHelp);
return EXCEPTION_CONTINUE_EXECUTION;
}
SYSTEMTIME stSysTime;
memset(&stSysTime, 0, sizeof(SYSTEMTIME));
GetLocalTime(&stSysTime);
TCHAR szFile[MAX_PATH] = { 0 }; //根据字符集,有时候可能为WCHAR
wsprintf(szFile, "%0.4d-%0.2d-%0.2d-%0.2d-%0.2d-%0.2d-%0.3d.dmp",\
stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay, stSysTime.wHour,\
stSysTime.wMinute, stSysTime.wSecond, stSysTime.wMilliseconds);
HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,\
0, CREATE_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE != hFile)
{
MINIDUMP_EXCEPTION_INFORMATION objExInfo;
objExInfo.ThreadId = ::GetCurrentThreadId();
objExInfo.ExceptionPointers = pExceptionInfo;
objExInfo.ClientPointers = NULL;
BOOL bOk = pfnMinidumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\
MiniDumpWithDataSegs, (pExceptionInfo ? &objExInfo : NULL), NULL, NULL);
CloseHandle(hFile);
}
FreeLibrary(hDbgHelp);
return EXCEPTION_EXECUTE_HANDLER;
}