#include <Dbghelp.h>
#include <time.h>
1、调用的函数定义
typedef BOOL (*MiniDumpWriteDump_PTR)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
void CreateMiniDump(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
HMODULE hModule = ::LoadLibrary(_T(".\\dbghelp.dll"));
if( NULL == hModule )
return;
MiniDumpWriteDump_PTR pfnMiniDumpWriteDump = (MiniDumpWriteDump_PTR)GetProcAddress(hModule, "MiniDumpWriteDump");
if( NULL == pfnMiniDumpWriteDump )
{
FreeLibrary(hModule);
return;
}
TCHAR szFile[MAX_PATH+1] = {0};
_sntprintf_s(szFile, sizeof(szFile),MAX_PATH, _T(".\\control_%u.dmp"), time(NULL));
HANDLE hFile = CreateFile(szFile, GENERIC_ALL, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if( INVALID_HANDLE_VALUE == hFile )
{
FreeLibrary(hModule);
return;
}
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId = GetCurrentThreadId();
mei.ClientPointers = TRUE;
mei.ExceptionPointers = ExceptionInfo;
(*pfnMiniDumpWriteDump)(GetCurrentProcess(), GetCurrentProcessId(), hFile,
MiniDumpWithFullMemory,
&mei, NULL, NULL);
CloseHandle(hFile);
FreeLibrary(hModule);
}
LONG WINAPI CCCtrl_UnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
OutputDebugString(_T("ESCControl meet unhandled SEH exception! Quit!\n"));
CreateMiniDump(ExceptionInfo);
::SetErrorMode(SEM_NOGPFAULTERRORBOX);
::ExitProcess(1);
return EXCEPTION_EXECUTE_HANDLER;
}
2、一般放在main函数的第一行
#ifndef _DEBUG
::SetUnhandledExceptionFilter(CCCtrl_UnhandledExceptionFilter);
#endif
#include <time.h>
1、调用的函数定义
typedef BOOL (*MiniDumpWriteDump_PTR)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
void CreateMiniDump(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
HMODULE hModule = ::LoadLibrary(_T(".\\dbghelp.dll"));
if( NULL == hModule )
return;
MiniDumpWriteDump_PTR pfnMiniDumpWriteDump = (MiniDumpWriteDump_PTR)GetProcAddress(hModule, "MiniDumpWriteDump");
if( NULL == pfnMiniDumpWriteDump )
{
FreeLibrary(hModule);
return;
}
TCHAR szFile[MAX_PATH+1] = {0};
_sntprintf_s(szFile, sizeof(szFile),MAX_PATH, _T(".\\control_%u.dmp"), time(NULL));
HANDLE hFile = CreateFile(szFile, GENERIC_ALL, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if( INVALID_HANDLE_VALUE == hFile )
{
FreeLibrary(hModule);
return;
}
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId = GetCurrentThreadId();
mei.ClientPointers = TRUE;
mei.ExceptionPointers = ExceptionInfo;
(*pfnMiniDumpWriteDump)(GetCurrentProcess(), GetCurrentProcessId(), hFile,
MiniDumpWithFullMemory,
&mei, NULL, NULL);
CloseHandle(hFile);
FreeLibrary(hModule);
}
LONG WINAPI CCCtrl_UnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
OutputDebugString(_T("ESCControl meet unhandled SEH exception! Quit!\n"));
CreateMiniDump(ExceptionInfo);
::SetErrorMode(SEM_NOGPFAULTERRORBOX);
::ExitProcess(1);
return EXCEPTION_EXECUTE_HANDLER;
}
2、一般放在main函数的第一行
#ifndef _DEBUG
::SetUnhandledExceptionFilter(CCCtrl_UnhandledExceptionFilter);
#endif