u_debug_symbol: Allow re-init of DbgHelp to work around already-initialized issues

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16182>
This commit is contained in:
Jesse Natalie 2022-04-26 12:47:50 -07:00 committed by Marge Bot
parent f51840d87c
commit 303c2754a3
1 changed files with 10 additions and 0 deletions

View File

@ -142,6 +142,8 @@ DBGHELP_DISPATCH(SymGetLineFromAddr64,
(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line),
(hProcess, dwAddr, pdwDisplacement, Line))
DBGHELP_DISPATCH(SymCleanup, BOOL, FALSE, (HANDLE hProcess), (hProcess))
#undef DBGHELP_DISPATCH
@ -167,6 +169,14 @@ debug_symbol_name_dbghelp(const void *addr, char* buf, unsigned size)
pSymbol->MaxNameLen = sizeof buffer - offsetof(SYMBOL_INFO, Name);
if (!g_bSymInitialized) {
/* Some components (e.g. Java) will init dbghelp before we're loaded, causing the "invade process"
* option to be invalid when attempting to re-init. But without it, we'd have to manually
* load symbols for all modules in the stack. For simplicity, we can just uninit and then
* re-"invade".
*/
if (debug_get_bool_option("GALLIUM_SYMBOL_FORCE_REINIT", false))
j_SymCleanup(hProcess);
j_SymSetOptions(/* SYMOPT_UNDNAME | */ SYMOPT_LOAD_LINES);
if (j_SymInitialize(hProcess, NULL, TRUE)) {
g_bSymInitialized = TRUE;