@@ -31,51 +31,37 @@ bool get_func(HMODULE module, F** func, char const* name) {
3131 return ((*func = reinterpret_cast <F*>(reinterpret_cast <void *>(GetProcAddress (module , name)))) != nullptr );
3232}
3333
34+ // clang-format off
35+ bool (WINAPI* EnumProcessModules)(HANDLE, HMODULE*, DWORD, DWORD*);
36+ bool (WINAPI* GetModuleInformation)(HANDLE, HMODULE, MODULEINFO*, DWORD);
37+ DWORD (WINAPI* GetModuleBaseName)(HANDLE, HMODULE, char **, DWORD);
3438IMAGE_NT_HEADERS* (*ImageNtHeader)(void *);
3539bool (WINAPI* SymCleanup)(HANDLE);
3640DWORD (WINAPI* SymGetOptions)();
3741bool (WINAPI* SymGetSearchPath)(HANDLE, char const *, DWORD);
3842bool (WINAPI* SymInitialize)(HANDLE, char const *, bool );
3943DWORD (WINAPI* SymSetOptions)(DWORD);
4044bool (WINAPI* SymSetSearchPath)(HANDLE, char const *);
41- bool (WINAPI* EnumProcessModules)(HANDLE, HMODULE*, DWORD, DWORD*);
42- bool (WINAPI* GetModuleInformation)(HANDLE, HMODULE, MODULEINFO*, DWORD);
43- DWORD (WINAPI* GetModuleBaseName)(HANDLE, HMODULE, char **, DWORD);
4445# ifdef _WIN64
4546void *(WINAPI* SymFunctionTableAccess)(HANDLE, DWORD64);
4647bool (WINAPI* SymGetLineFromAddr)(HANDLE, DWORD64, DWORD*, IMAGEHLP_LINE64*);
4748DWORD64 (WINAPI* SymGetModuleBase)(HANDLE, DWORD64);
4849bool (WINAPI* SymGetModuleInfo)(HANDLE, DWORD64, IMAGEHLP_MODULE64*);
4950bool (WINAPI* SymGetSymFromAddr)(HANDLE, DWORD64, DWORD64*, IMAGEHLP_SYMBOL64*);
5051DWORD64 (WINAPI* SymLoadModule)(HANDLE, HANDLE, char const *, char const *, void *, DWORD);
51- bool (WINAPI* StackWalk)(
52- DWORD,
53- HANDLE,
54- HANDLE,
55- STACKFRAME64*,
56- void *,
57- void *,
58- decltype (SymFunctionTableAccess),
59- decltype(SymGetModuleBase),
60- void*);
52+ bool (WINAPI* StackWalk)(DWORD, HANDLE, HANDLE, STACKFRAME64*, void *, void *,
53+ decltype (SymFunctionTableAccess), decltype(SymGetModuleBase), void*);
6154# else
6255void *(WINAPI* SymFunctionTableAccess)(HANDLE, DWORD);
6356bool (WINAPI* SymGetLineFromAddr)(HANDLE, DWORD, DWORD*, IMAGEHLP_LINE*);
6457DWORD (WINAPI* SymGetModuleBase)(HANDLE, DWORD);
6558bool (WINAPI* SymGetModuleInfo)(HANDLE, DWORD, IMAGEHLP_MODULE*);
6659bool (WINAPI* SymGetSymFromAddr)(HANDLE, DWORD, DWORD*, IMAGEHLP_SYMBOL*);
6760DWORD (WINAPI* SymLoadModule)(HANDLE, HANDLE, char const *, char const *, void *, DWORD);
68- bool (WINAPI* StackWalk)(
69- DWORD,
70- HANDLE,
71- HANDLE,
72- STACKFRAME*,
73- void *,
74- void *,
75- decltype (SymFunctionTableAccess),
76- decltype(SymGetModuleBase),
77- void*);
61+ bool (WINAPI* StackWalk)(DWORD, HANDLE, HANDLE, STACKFRAME*, void *, void *,
62+ decltype (SymFunctionTableAccess), decltype(SymGetModuleBase), void*);
7863# endif
64+ // clang-format on
7965
8066bool loadFuncs () {
8167 static bool attempted{false };
@@ -93,23 +79,23 @@ bool loadFuncs() {
9379
9480 attempted = true ;
9581
96- HMODULE dbghelp = LoadLibrary ( " dbghelp .dll" );
97- HMODULE psapi = LoadLibrary ( " psapi .dll" );
82+ HMODULE psapi = LoadLibraryA ( " psapi .dll" );
83+ HMODULE dbghelp = LoadLibraryA ( " dbghelp .dll" );
9884
9985 // clang-format off
10086 succeeded = true
101- && (dbghelp != nullptr )
10287 && (psapi != nullptr )
88+ && (dbghelp != nullptr )
89+ && get_func (psapi, &EnumProcessModules, " EnumProcessModules" )
90+ && get_func (psapi, &GetModuleInformation, " GetModuleInformation" )
91+ && get_func (psapi, &GetModuleBaseName, " GetModuleBaseNameA" )
10392 && get_func (dbghelp, &ImageNtHeader, " ImageNtHeader" )
10493 && get_func (dbghelp, &SymCleanup, " SymCleanup" )
10594 && get_func (dbghelp, &SymGetOptions, " SymGetOptions" )
10695 && get_func (dbghelp, &SymGetSearchPath, " SymGetSearchPath" )
10796 && get_func (dbghelp, &SymInitialize, " SymInitialize" )
10897 && get_func (dbghelp, &SymSetOptions, " SymSetOptions" )
10998 && get_func (dbghelp, &SymSetSearchPath, " SymSetSearchPath" )
110- && get_func (psapi, &EnumProcessModules, " EnumProcessModules" )
111- && get_func (psapi, &GetModuleInformation, " GetModuleInformation" )
112- && get_func (psapi, &GetModuleBaseName, " GetModuleBaseNameA" )
11399#ifdef _WIN64
114100 && get_func (dbghelp, &StackWalk, " StackWalk64" )
115101 && get_func (dbghelp, &SymFunctionTableAccess, " SymFunctionTableAccess64" )
@@ -130,8 +116,6 @@ bool loadFuncs() {
130116 ;
131117 // clang-format on
132118
133- FreeLibrary (psapi);
134- FreeLibrary (dbghelp);
135119 return succeeded;
136120}
137121
@@ -285,16 +269,18 @@ _LIBCPP_EXPORTED_FROM_ABI void _Trace::windows_impl(size_t skip, size_t max_dept
285269 IMAGEHLP_SYMBOL* sym = reinterpret_cast <IMAGEHLP_SYMBOL*>(space);
286270 sym->SizeOfStruct = sizeof (IMAGEHLP_SYMBOL);
287271 sym->MaxNameLength = __max_sym_len;
272+
288273# if defined(_WIN64)
289274 DWORD64 symdisp{};
290275# else
291276 DWORD symdisp{};
292277# endif
293- DWORD linedisp{};
294278 IMAGEHLP_LINE line;
295279 if (SymGetSymFromAddr (proc, entry.__addr_ , &symdisp, sym)) {
296280 entry.__desc_ .assign (sym->Name );
297281 }
282+
283+ DWORD linedisp{};
298284 line.SizeOfStruct = sizeof (IMAGEHLP_LINE);
299285 if (SymGetLineFromAddr (proc, entry.__addr_ , &linedisp, &line)) {
300286 entry.__file_ .assign (line.FileName );
0 commit comments