From 3c0a309ac53f969346baa8a2725bef5f059c7705 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 5 Oct 2015 13:04:31 -0700 Subject: [PATCH] libobs: Move SymRefreshModuleList to crash handler There's no need to refresh the actual module list for the crash handler until a crash has occurred. Reduces startup time for this function call from 400ms to 40ms. --- libobs/obs-win-crash-handler.c | 10 +++++++++- libobs/obs-windows.c | 13 ++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libobs/obs-win-crash-handler.c b/libobs/obs-win-crash-handler.c index fc87194d2..283d6dbaa 100644 --- a/libobs/obs-win-crash-handler.c +++ b/libobs/obs-win-crash-handler.c @@ -40,6 +40,7 @@ typedef BOOL (WINAPI *STACKWALK64)(DWORD machine_type, HANDLE process, PFUNCTION_TABLE_ACCESS_ROUTINE64 function_table_access_routine, PGET_MODULE_BASE_ROUTINE64 get_module_base_routine, PTRANSLATE_ADDRESS_ROUTINE64 translate_address); +typedef BOOL (WINAPI *SYMREFRESHMODULELIST)(HANDLE process); typedef PVOID (WINAPI *SYMFUNCTIONTABLEACCESS64)(HANDLE process, DWORD64 addr_base); @@ -78,6 +79,7 @@ struct exception_handler_data { SYMGETMODULEBASE64 sym_get_module_base64; SYMFROMADDR sym_from_addr; SYMGETMODULEINFO64 sym_get_module_info64; + SYMREFRESHMODULELIST sym_refresh_module_list; STACKWALK64 stack_walk64; ENUMERATELOADEDMODULES64 enumerate_loaded_modules64; MINIDUMPWRITEDUMP minidump_write_dump; @@ -134,6 +136,7 @@ static inline bool get_dbghelp_imports(struct exception_handler_data *data) GET_DBGHELP_IMPORT(sym_get_module_base64, "SymGetModuleBase64"); GET_DBGHELP_IMPORT(sym_from_addr, "SymFromAddrW"); GET_DBGHELP_IMPORT(sym_get_module_info64, "SymGetModuleInfo64"); + GET_DBGHELP_IMPORT(sym_refresh_module_list, "SymRefreshModuleList"); GET_DBGHELP_IMPORT(stack_walk64, "StackWalk64"); GET_DBGHELP_IMPORT(enumerate_loaded_modules64, "EnumerateLoadedModulesW64"); @@ -163,6 +166,8 @@ static inline void init_instruction_data(struct stack_trace *trace) trace->frame.AddrStack.Mode = AddrModeFlat; } +extern bool sym_initialize_called; + static inline void init_sym_info(struct exception_handler_data *data) { data->sym_set_options( @@ -170,7 +175,10 @@ static inline void init_sym_info(struct exception_handler_data *data) SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_ANYTHING); - data->sym_initialize(data->process, NULL, true); + if (!sym_initialize_called) + data->sym_initialize(data->process, NULL, true); + else + data->sym_refresh_module_list(data->process); data->sym_info = LocalAlloc(LPTR, sizeof(*data->sym_info) + 256); data->sym_info->SizeOfStruct = sizeof(SYMBOL_INFO); diff --git a/libobs/obs-windows.c b/libobs/obs-windows.c index 63e58c055..ef837e69b 100644 --- a/libobs/obs-windows.c +++ b/libobs/obs-windows.c @@ -524,11 +524,12 @@ static char *get_abs_path(const char *path) return abspath; } +bool sym_initialize_called = false; + void reset_win32_symbol_paths(void) { static BOOL (WINAPI *sym_initialize_w)(HANDLE, const wchar_t*, BOOL); static BOOL (WINAPI *sym_set_search_path_w)(HANDLE, const wchar_t*); - static BOOL (WINAPI *sym_refresh_module_list)(HANDLE); static bool funcs_initialized = false; static bool initialize_success = false; @@ -551,10 +552,7 @@ void reset_win32_symbol_paths(void) sym_initialize_w = (void*)GetProcAddress(mod, "SymInitializeW"); sym_set_search_path_w = (void*)GetProcAddress(mod, "SymSetSearchPathW"); - sym_refresh_module_list = (void*)GetProcAddress(mod, - "SymRefreshModuleList"); - if (!sym_initialize_w || !sym_set_search_path_w || - !sym_refresh_module_list) + if (!sym_initialize_w || !sym_set_search_path_w) return; initialize_success = true; @@ -615,16 +613,13 @@ void reset_win32_symbol_paths(void) if (path_str.array) { os_utf8_to_wcs_ptr(path_str.array, path_str.len, &path_str_w); if (path_str_w) { - static bool sym_initialize_called = false; - if (!sym_initialize_called) { sym_initialize_w(GetCurrentProcess(), - path_str_w, true); + path_str_w, false); sym_initialize_called = true; } else { sym_set_search_path_w(GetCurrentProcess(), path_str_w); - sym_refresh_module_list(GetCurrentProcess()); } bfree(path_str_w);