diff options
Diffstat (limited to 'src/os/windows/crashlog_win.cpp')
-rw-r--r-- | src/os/windows/crashlog_win.cpp | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 1d3ed5193..5ce04e52e 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -368,22 +368,7 @@ static const uint MAX_FRAMES = 64; char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) const { -#define M(x) x "\0" - static const char dbg_import[] = - M("dbghelp.dll") - M("SymInitialize") - M("SymSetOptions") - M("SymCleanup") - M("StackWalk64") - M("SymFunctionTableAccess64") - M("SymGetModuleBase64") - M("SymGetModuleInfo64") - M("SymGetSymFromAddr64") - M("SymGetLineFromAddr64") - M("") - ; -#undef M - + DllLoader dbghelp(L"dbghelp.dll"); struct ProcPtrs { BOOL (WINAPI * pSymInitialize)(HANDLE, PCSTR, BOOL); BOOL (WINAPI * pSymSetOptions)(DWORD); @@ -394,12 +379,22 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c BOOL (WINAPI * pSymGetModuleInfo64)(HANDLE, DWORD64, PIMAGEHLP_MODULE64); BOOL (WINAPI * pSymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64); BOOL (WINAPI * pSymGetLineFromAddr64)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); - } proc; + } proc = { + dbghelp.GetProcAddress("SymInitialize"), + dbghelp.GetProcAddress("SymSetOptions"), + dbghelp.GetProcAddress("SymCleanup"), + dbghelp.GetProcAddress("StackWalk64"), + dbghelp.GetProcAddress("SymFunctionTableAccess64"), + dbghelp.GetProcAddress("SymGetModuleBase64"), + dbghelp.GetProcAddress("SymGetModuleInfo64"), + dbghelp.GetProcAddress("SymGetSymFromAddr64"), + dbghelp.GetProcAddress("SymGetLineFromAddr64"), + }; buffer += seprintf(buffer, last, "\nDecoded stack trace:\n"); /* Try to load the functions from the DLL, if that fails because of a too old dbghelp.dll, just skip it. */ - if (LoadLibraryList((Function*)&proc, dbg_import)) { + if (dbghelp.Success()) { /* Initialize symbol handler. */ HANDLE hCur = GetCurrentProcess(); proc.pSymInitialize(hCur, nullptr, TRUE); @@ -486,14 +481,14 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c /* virtual */ int CrashLogWindows::WriteCrashDump(char *filename, const char *filename_last) const { int ret = 0; - HMODULE dbghelp = LoadLibrary(L"dbghelp.dll"); - if (dbghelp != nullptr) { + DllLoader dbghelp(L"dbghelp.dll"); + if (dbghelp.Success()) { typedef BOOL (WINAPI *MiniDumpWriteDump_t)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, CONST PMINIDUMP_EXCEPTION_INFORMATION, CONST PMINIDUMP_USER_STREAM_INFORMATION, CONST PMINIDUMP_CALLBACK_INFORMATION); - MiniDumpWriteDump_t funcMiniDumpWriteDump = (MiniDumpWriteDump_t)GetProcAddress(dbghelp, "MiniDumpWriteDump"); + MiniDumpWriteDump_t funcMiniDumpWriteDump = dbghelp.GetProcAddress("MiniDumpWriteDump"); if (funcMiniDumpWriteDump != nullptr) { seprintf(filename, filename_last, "%scrash.dmp", _personal_dir.c_str()); HANDLE file = CreateFile(OTTD2FS(filename).c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, 0); @@ -519,7 +514,6 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c } else { ret = -1; } - FreeLibrary(dbghelp); } return ret; } |