HGBase中增加处理崩溃的模块HGCrash

This commit is contained in:
luoliangyi 2022-07-13 17:16:35 +08:00
parent 90d5e1571a
commit dec8a54a71
4 changed files with 87 additions and 4 deletions

View File

@ -9,6 +9,8 @@ HGBase_DesEncrypt
HGBase_DesDecrypt
HGBase_MakeMd5
HGBase_RegisterCrashFunc
HGBase_MakeCrashFile
HGBase_CreateDll
HGBase_DestroyDll

View File

@ -26,6 +26,7 @@
<ClCompile Include="..\..\..\modules\base\HGBase64.cpp" />
<ClCompile Include="..\..\..\modules\base\HGBuffer.cpp" />
<ClCompile Include="..\..\..\modules\base\HGConsole.cpp" />
<ClCompile Include="..\..\..\modules\base\HGCrash.cpp" />
<ClCompile Include="..\..\..\modules\base\HGDes.cpp" />
<ClCompile Include="..\..\..\modules\base\HGDll.cpp" />
<ClCompile Include="..\..\..\modules\base\HGEvent.cpp" />
@ -47,6 +48,7 @@
<ClInclude Include="..\..\..\modules\base\HGBase64.h" />
<ClInclude Include="..\..\..\modules\base\HGBaseErr.h" />
<ClInclude Include="..\..\..\modules\base\HGConsole.h" />
<ClInclude Include="..\..\..\modules\base\HGCrash.h" />
<ClInclude Include="..\..\..\modules\base\HGInc.h" />
<ClInclude Include="..\..\..\modules\base\HGBuffer.h" />
<ClInclude Include="..\..\..\modules\base\HGDef.h" />
@ -145,7 +147,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGBase.def</ModuleDefinitionFile>
<AdditionalDependencies>gdiplus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>
@ -171,7 +173,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGBase.def</ModuleDefinitionFile>
<AdditionalDependencies>gdiplus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
@ -196,7 +198,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\</Comman
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGBase.def</ModuleDefinitionFile>
<AdditionalDependencies>gdiplus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>
@ -222,7 +224,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\</Comman
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>HGBase.def</ModuleDefinitionFile>
<AdditionalDependencies>gdiplus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>

66
modules/base/HGCrash.cpp Normal file
View File

@ -0,0 +1,66 @@
#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
}

13
modules/base/HGCrash.h Normal file
View File

@ -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__ */