diff --git a/build/windows/HGBase/HGBase.def b/build/windows/HGBase/HGBase.def index 9f69529f..04bc705b 100644 --- a/build/windows/HGBase/HGBase.def +++ b/build/windows/HGBase/HGBase.def @@ -9,6 +9,8 @@ HGBase_DesEncrypt HGBase_DesDecrypt HGBase_MakeMd5 +HGBase_RegisterCrashFunc +HGBase_MakeCrashFile HGBase_CreateDll HGBase_DestroyDll diff --git a/build/windows/HGBase/HGBase.vcxproj b/build/windows/HGBase/HGBase.vcxproj index 316c22f5..3dfeeb70 100644 --- a/build/windows/HGBase/HGBase.vcxproj +++ b/build/windows/HGBase/HGBase.vcxproj @@ -26,6 +26,7 @@ + @@ -47,6 +48,7 @@ + @@ -145,7 +147,7 @@ true false HGBase.def - gdiplus.lib;%(AdditionalDependencies) + gdiplus.lib;dbghelp.lib;%(AdditionalDependencies) @@ -171,7 +173,7 @@ true false HGBase.def - gdiplus.lib;%(AdditionalDependencies) + gdiplus.lib;dbghelp.lib;%(AdditionalDependencies) /LTCG %(AdditionalOptions) @@ -196,7 +198,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\true false HGBase.def - gdiplus.lib;%(AdditionalDependencies) + gdiplus.lib;dbghelp.lib;%(AdditionalDependencies) @@ -222,7 +224,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\true false HGBase.def - gdiplus.lib;%(AdditionalDependencies) + gdiplus.lib;dbghelp.lib;%(AdditionalDependencies) /LTCG %(AdditionalOptions) diff --git a/modules/base/HGCrash.cpp b/modules/base/HGCrash.cpp new file mode 100644 index 00000000..1d7f5c90 --- /dev/null +++ b/modules/base/HGCrash.cpp @@ -0,0 +1,66 @@ +#include "HGCrash.h" +#include "HGInc.h" +#if defined(HG_CMP_MSC) +#include +#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 +} \ No newline at end of file diff --git a/modules/base/HGCrash.h b/modules/base/HGCrash.h new file mode 100644 index 00000000..03064177 --- /dev/null +++ b/modules/base/HGCrash.h @@ -0,0 +1,13 @@ +#ifndef __HGCRASH_H__ +#define __HGCRASH_H__ + +#include "HGDef.h" +#include "HGBaseErr.h" + +typedef void (*HGCrashFunc)(HGPointer crashAddr, HGPointer param); + +HGEXPORT HGResult HGAPI HGBase_RegisterCrashFunc(HGCrashFunc func, HGPointer param); + +HGEXPORT HGResult HGAPI HGBase_MakeCrashFile(const HGChar *filePath); + +#endif /* __HGCRASH_H__ */ \ No newline at end of file