2022-07-13 09:16:35 +00:00
|
|
|
|
#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
|
2022-11-25 10:00:33 +00:00
|
|
|
|
return HGBASE_ERR_NOTIMPL;
|
2022-07-13 09:16:35 +00:00
|
|
|
|
#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)
|
|
|
|
|
{
|
2022-11-25 10:00:33 +00:00
|
|
|
|
return HGBASE_ERR_ACCESSDENIED;
|
2022-07-13 09:16:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
2022-11-25 10:00:33 +00:00
|
|
|
|
return HGBASE_ERR_NOTIMPL;
|
2022-07-13 09:16:35 +00:00
|
|
|
|
#endif
|
|
|
|
|
}
|