Skip to content

Commit 87b72af

Browse files
Fix windows
1 parent fb7259f commit 87b72af

File tree

1 file changed

+18
-32
lines changed

1 file changed

+18
-32
lines changed

libcxx/src/stacktrace/windows_impl.cpp

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
3438
IMAGE_NT_HEADERS* (*ImageNtHeader)(void*);
3539
bool(WINAPI* SymCleanup)(HANDLE);
3640
DWORD(WINAPI* SymGetOptions)();
3741
bool(WINAPI* SymGetSearchPath)(HANDLE, char const*, DWORD);
3842
bool(WINAPI* SymInitialize)(HANDLE, char const*, bool);
3943
DWORD(WINAPI* SymSetOptions)(DWORD);
4044
bool(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
4546
void*(WINAPI* SymFunctionTableAccess)(HANDLE, DWORD64);
4647
bool(WINAPI* SymGetLineFromAddr)(HANDLE, DWORD64, DWORD*, IMAGEHLP_LINE64*);
4748
DWORD64(WINAPI* SymGetModuleBase)(HANDLE, DWORD64);
4849
bool(WINAPI* SymGetModuleInfo)(HANDLE, DWORD64, IMAGEHLP_MODULE64*);
4950
bool(WINAPI* SymGetSymFromAddr)(HANDLE, DWORD64, DWORD64*, IMAGEHLP_SYMBOL64*);
5051
DWORD64(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
6255
void*(WINAPI* SymFunctionTableAccess)(HANDLE, DWORD);
6356
bool(WINAPI* SymGetLineFromAddr)(HANDLE, DWORD, DWORD*, IMAGEHLP_LINE*);
6457
DWORD(WINAPI* SymGetModuleBase)(HANDLE, DWORD);
6558
bool(WINAPI* SymGetModuleInfo)(HANDLE, DWORD, IMAGEHLP_MODULE*);
6659
bool(WINAPI* SymGetSymFromAddr)(HANDLE, DWORD, DWORD*, IMAGEHLP_SYMBOL*);
6760
DWORD(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

8066
bool 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

Comments
 (0)