code_app/modules/base/HGCrash.cpp

66 lines
1.6 KiB
C++

#include "HGCrash.h"
#include "HGInc.h"
#if defined(HG_CMP_MSC)
#include <Dbghelp.h>
#endif
static HGCrashFunc g_crashFunc = NULL;
static HGPointer g_crashParam = NULL;
#if defined(HG_CMP_MSC)
static _EXCEPTION_POINTERS* g_exceptionInfo = NULL;
#endif
#if defined(HG_CMP_MSC)
static LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS* exceptionInfo)
{
g_exceptionInfo = exceptionInfo;
if (NULL != g_crashFunc)
g_crashFunc(exceptionInfo->ExceptionRecord->ExceptionAddress, g_crashParam);
g_exceptionInfo = NULL;
return EXCEPTION_EXECUTE_HANDLER;
}
#endif
HGResult HGAPI HGBase_RegisterCrashFunc(HGCrashFunc func, HGPointer param)
{
if (NULL == func)
{
return HGBASE_ERR_INVALIDARG;
}
#if defined(HG_CMP_MSC)
g_crashFunc = func;
g_crashParam = param;
SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
return HGBASE_ERR_OK;
#else
return HGBASE_ERR_FAIL;
#endif
}
HGResult HGAPI HGBase_MakeCrashFile(const HGChar* filePath)
{
#if defined(HG_CMP_MSC)
if (NULL == g_exceptionInfo)
{
return HGBASE_ERR_FAIL;
}
HANDLE hFile = CreateFileA(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return HGBASE_ERR_FAIL;
}
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = g_exceptionInfo;
mdei.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, NULL);
CloseHandle(hFile);
return HGBASE_ERR_OK;
#else
return HGBASE_ERR_FAIL;
#endif
}