Skip to content

Commit

Permalink
feat:实现dump机制,在api调用前注册,去除了异常捕获部分
Browse files Browse the repository at this point in the history
  • Loading branch information
GengGode committed Apr 15, 2023
1 parent 8e85f22 commit b9ce182
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 118 deletions.
82 changes: 36 additions & 46 deletions cvAutoTrack/src/cvAutoTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,151 +6,141 @@
#include "ErrorCode.h"
#include "AutoTrack.h"


//定义一个装饰器做异常处理
#define TRY_CATCH(func,defaultVal)\
try {\
return func;\
}\
catch (std::exception ex)\
{\
err = { 999,std::format("std错误:{0}",ex.what()) };\
return defaultVal;\
}

#define INSTALL_DUMP(at_func)\
INSTALL_DUMP_();\
return at_func

static AutoTrack _at;
static ErrorCode& err = ErrorCode::getInstance();

bool __stdcall verison(char* versionBuff)
{
TRY_CATCH(_at.GetVersion(versionBuff,32),false);
INSTALL_DUMP(_at.GetVersion(versionBuff,32));
}
bool __stdcall init()
{
TRY_CATCH(_at.init(),false);
INSTALL_DUMP(_at.init());
}
bool __stdcall uninit()
{
TRY_CATCH(_at.uninit(),false);
INSTALL_DUMP(_at.uninit());
}
bool __stdcall SetUseBitbltCaptureMode()
{
TRY_CATCH(_at.SetUseBitbltCaptureMode(),false);
INSTALL_DUMP(_at.SetUseBitbltCaptureMode());
}
bool __stdcall SetUseDx11CaptureMode()
{
TRY_CATCH(_at.SetUseDx11CaptureMode(),false);
INSTALL_DUMP(_at.SetUseDx11CaptureMode());
}
bool __stdcall SetHandle(long long int handle = 0)
{
TRY_CATCH(_at.SetHandle(handle),false);
INSTALL_DUMP(_at.SetHandle(handle));
}
bool __stdcall SetWorldCenter(double x, double y)
{
TRY_CATCH(_at.SetWorldCenter(x, y),false);
INSTALL_DUMP(_at.SetWorldCenter(x, y));
}
bool __stdcall SetWorldScale(double scale)
{
TRY_CATCH(_at.SetWorldScale(scale),false);
INSTALL_DUMP(_at.SetWorldScale(scale));
}
bool __stdcall ImportMapBlock(int id_x, int id_y, const char* image_data, int image_data_size, int image_width, int image_height)
{
TRY_CATCH(_at.ImportMapBlock(id_x, id_y, image_data, image_data_size, image_width, image_height),false);
INSTALL_DUMP(_at.ImportMapBlock(id_x, id_y, image_data, image_data_size, image_width, image_height));
}
bool __stdcall ImportMapBlockCenter(int x, int y)
{
TRY_CATCH(_at.ImportMapBlockCenter(x, y),false);
INSTALL_DUMP(_at.ImportMapBlockCenter(x, y));
}
bool __stdcall ImportMapBlockCenterScale(int x, int y, double scale)
{
TRY_CATCH(_at.ImportMapBlockCenterScale(x, y, scale),false);
INSTALL_DUMP(_at.ImportMapBlockCenterScale(x, y, scale));
}
bool __stdcall GetTransformOfMap(double& x, double& y, double& a, int& mapId)
{
TRY_CATCH(_at.GetTransformOfMap(x, y, a, mapId),false);
INSTALL_DUMP(_at.GetTransformOfMap(x, y, a, mapId));
}
bool __stdcall GetPositionOfMap(double& x, double& y, int& mapId)
{
TRY_CATCH(_at.GetPositionOfMap(x, y, mapId),false);
INSTALL_DUMP(_at.GetPositionOfMap(x, y, mapId));
}
bool __stdcall GetDirection(double & a)
{
TRY_CATCH(_at.GetDirection(a),false);
INSTALL_DUMP(_at.GetDirection(a));
}
bool __stdcall GetRotation(double & a)
{
TRY_CATCH(_at.GetRotation(a),false);
INSTALL_DUMP(_at.GetRotation(a));
}
bool __stdcall GetStar(double &x, double &y, bool &isEnd)
{
TRY_CATCH(_at.GetStar(x, y, isEnd),false);
INSTALL_DUMP(_at.GetStar(x, y, isEnd));
}
bool __stdcall GetStarJson(char * jsonBuff)
{
TRY_CATCH(_at.GetStarJson(jsonBuff),false);
INSTALL_DUMP(_at.GetStarJson(jsonBuff));
}
bool __stdcall GetUID(int & uid)
{
TRY_CATCH(_at.GetUID(uid),false);
INSTALL_DUMP(_at.GetUID(uid));
}
bool __stdcall GetAllInfo(double& x, double& y, int& mapId, double& a, double& r, int& uid)
{
TRY_CATCH(_at.GetAllInfo(x, y, mapId, a, r, uid),false);
INSTALL_DUMP(_at.GetAllInfo(x, y, mapId, a, r, uid));
}
bool __stdcall GetInfoLoadPicture(char * path, int & uid, double & x, double & y, double & a)
{
TRY_CATCH(_at.GetInfoLoadPicture(path, uid, x, y, a),false);
INSTALL_DUMP(_at.GetInfoLoadPicture(path, uid, x, y, a));
}
bool __stdcall GetInfoLoadVideo(char * path, char * pathOutFile)
{
TRY_CATCH(_at.GetInfoLoadVideo(path, pathOutFile),false);
INSTALL_DUMP(_at.GetInfoLoadVideo(path, pathOutFile));
}
int __stdcall GetLastErr()
{
TRY_CATCH(_at.GetLastError(),999);
INSTALL_DUMP(_at.GetLastError());
}
int __stdcall GetLastErrMsg(char* msg_buff, int buff_size)
{
TRY_CATCH(_at.GetLastErrMsg(msg_buff, buff_size),999);
INSTALL_DUMP(_at.GetLastErrMsg(msg_buff, buff_size));
}
int __stdcall GetLastErrJson(char* json_buff, int buff_size)
{
TRY_CATCH(_at.GetLastErrJson(json_buff, buff_size),999);
INSTALL_DUMP(_at.GetLastErrJson(json_buff, buff_size));
}
bool __stdcall SetDisableFileLog()
{
TRY_CATCH(_at.SetDisableFileLog(),false);
INSTALL_DUMP(_at.SetDisableFileLog());
}
bool __stdcall SetEnableFileLog()
{
TRY_CATCH(_at.SetEnableFileLog(),false);
INSTALL_DUMP(_at.SetEnableFileLog());
}
bool __stdcall GetCompileVersion(char* version_buff, int buff_size)
{
TRY_CATCH(_at.GetVersion(version_buff, buff_size),false);
INSTALL_DUMP(_at.GetVersion(version_buff, buff_size));
}
bool __stdcall GetCompileTime(char* time_buff, int buff_size)
{
TRY_CATCH(_at.GetCompileTime(time_buff, buff_size),false);
INSTALL_DUMP(_at.GetCompileTime(time_buff, buff_size));
}
bool __stdcall GetMapIsEmbedded()
{
TRY_CATCH(_at.GetMapIsEmbedded(),false);
INSTALL_DUMP(_at.GetMapIsEmbedded());
}
bool __stdcall DebugCapture()
{
TRY_CATCH(_at.DebugCapture(),false);
INSTALL_DUMP(_at.DebugCapture());
}
bool __stdcall DebugCapturePath(const char* path_buff, int buff_size)
{
TRY_CATCH(_at.DebugCapturePath(path_buff, buff_size),false);
INSTALL_DUMP(_at.DebugCapturePath(path_buff, buff_size));
}
bool __stdcall startServe()
{
TRY_CATCH(_at.startServe(),false);
INSTALL_DUMP(_at.startServe());
}
bool __stdcall stopServe()
{
TRY_CATCH(_at.stopServe(),false);
INSTALL_DUMP(_at.stopServe());
}
72 changes: 1 addition & 71 deletions cvAutoTrack/src/dllmain.cpp
Original file line number Diff line number Diff line change
@@ -1,81 +1,11 @@
#include "pch.h"



#include "Windows.h"
#include "DbgHelp.h"
#include "tchar.h"

int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
{
// 定义函数指针
typedef BOOL(WINAPI* MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);
// 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数
MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));
if (NULL == hDbgHelp)
{
return EXCEPTION_CONTINUE_EXECUTION;
}
pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

if (NULL == pfnMiniDumpWriteDump)
{
FreeLibrary(hDbgHelp);
return EXCEPTION_CONTINUE_EXECUTION;
}
// 创建 dmp 文件件
TCHAR szFileName[MAX_PATH] = { 0 };
TCHAR szVersion[] = TEXT("cvAutoTrack");
SYSTEMTIME stLocalTime;
GetLocalTime(&stLocalTime);
wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp",
szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE == hDumpFile)
{
FreeLibrary(hDbgHelp);
return EXCEPTION_CONTINUE_EXECUTION;
}
// 写入 dmp 文件
MINIDUMP_EXCEPTION_INFORMATION expParam;
expParam.ThreadId = GetCurrentThreadId();
expParam.ExceptionPointers = pExceptionPointers;
expParam.ClientPointers = FALSE;
pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
// 释放文件
CloseHandle(hDumpFile);
FreeLibrary(hDbgHelp);
return EXCEPTION_EXECUTE_HANDLER;
}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
// 这里做一些异常的过滤或提示
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}
return GenerateMiniDump(lpExceptionInfo);
}

BOOL APIENTRY DllMain(HMODULE /*hModule*/,
DWORD ul_reason_for_call,
LPVOID /*lpReserved*/
)
{
SetUnhandledExceptionFilter(ExceptionFilter);
INSTALL_DUMP_();
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Expand Down
66 changes: 66 additions & 0 deletions cvAutoTrack/src/pch.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,70 @@
#include "capture/dxgi/include/direct3d11.interop.h"
#include "capture/dxgi/include/capture.interop.h"

// DUMP部分
#include "Windows.h"
#include "DbgHelp.h"
#include "tchar.h"
inline int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
{
// 定义函数指针
typedef BOOL(WINAPI* MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);
// 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数
MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));
if (NULL == hDbgHelp)
{
return EXCEPTION_CONTINUE_EXECUTION;
}
pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

if (NULL == pfnMiniDumpWriteDump)
{
FreeLibrary(hDbgHelp);
return EXCEPTION_CONTINUE_EXECUTION;
}
// 创建 dmp 文件件
TCHAR szFileName[MAX_PATH] = { 0 };
TCHAR szVersion[] = TEXT("cvAutoTrack");
SYSTEMTIME stLocalTime;
GetLocalTime(&stLocalTime);
wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp",
szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE == hDumpFile)
{
FreeLibrary(hDbgHelp);
return EXCEPTION_CONTINUE_EXECUTION;
}
// 写入 dmp 文件
MINIDUMP_EXCEPTION_INFORMATION expParam;
expParam.ThreadId = GetCurrentThreadId();
expParam.ExceptionPointers = pExceptionPointers;
expParam.ClientPointers = FALSE;
pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
// 释放文件
CloseHandle(hDumpFile);
FreeLibrary(hDbgHelp);
return EXCEPTION_EXECUTE_HANDLER;
}
inline LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
if (IsDebuggerPresent())
{
return EXCEPTION_CONTINUE_SEARCH;
}
return GenerateMiniDump(lpExceptionInfo);
}
#define INSTALL_DUMP_() SetUnhandledExceptionFilter(ExceptionFilter)
#endif //PCH_H
2 changes: 1 addition & 1 deletion cvAutoTrack/src/version/version_tag.tag
Original file line number Diff line number Diff line change
@@ -1 +1 @@
7.7.6
7.7.11

0 comments on commit b9ce182

Please sign in to comment.