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.
This commit is contained in:
parent
e91f5384b4
commit
3c0a309ac5
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user