in source/windows/system_info.c [79:150]
typedef BOOL __stdcall SymFromAddr_fn(
_In_ HANDLE hProcess,
_In_ DWORD64 Address,
_Out_opt_ PDWORD64 Displacement,
_Inout_ PSYMBOL_INFO Symbol);
# if defined(_WIN64)
typedef BOOL __stdcall SymGetLineFromAddr_fn(
_In_ HANDLE hProcess,
_In_ DWORD64 qwAddr,
_Out_ PDWORD pdwDisplacement,
_Out_ PIMAGEHLP_LINE64 Line64);
# define SymGetLineFromAddrName "SymGetLineFromAddr64"
# else
typedef BOOL __stdcall SymGetLineFromAddr_fn(
_In_ HANDLE hProcess,
_In_ DWORD dwAddr,
_Out_ PDWORD pdwDisplacement,
_Out_ PIMAGEHLP_LINE Line);
# define SymGetLineFromAddrName "SymGetLineFromAddr"
# endif
static SymInitialize_fn *s_SymInitialize = NULL;
static SymSetOptions_fn *s_SymSetOptions = NULL;
static SymFromAddr_fn *s_SymFromAddr = NULL;
static SymGetLineFromAddr_fn *s_SymGetLineFromAddr = NULL;
static aws_thread_once s_init_once = AWS_THREAD_ONCE_STATIC_INIT;
static void s_init_dbghelp_impl(void *user_data) {
(void)user_data;
HMODULE dbghelp = LoadLibraryA("DbgHelp.dll");
if (!dbghelp) {
fprintf(stderr, "Failed to load DbgHelp.dll.\n");
goto done;
}
s_SymInitialize = (SymInitialize_fn *)GetProcAddress(dbghelp, "SymInitialize");
if (!s_SymInitialize) {
fprintf(stderr, "Failed to load SymInitialize from DbgHelp.dll.\n");
goto done;
}
s_SymSetOptions = (SymSetOptions_fn *)GetProcAddress(dbghelp, "SymSetOptions");
if (!s_SymSetOptions) {
fprintf(stderr, "Failed to load SymSetOptions from DbgHelp.dll\n");
goto done;
}
s_SymFromAddr = (SymFromAddr_fn *)GetProcAddress(dbghelp, "SymFromAddr");
if (!s_SymFromAddr) {
fprintf(stderr, "Failed to load SymFromAddr from DbgHelp.dll.\n");
goto done;
}
s_SymGetLineFromAddr = (SymGetLineFromAddr_fn *)GetProcAddress(dbghelp, SymGetLineFromAddrName);
if (!s_SymGetLineFromAddr) {
fprintf(stderr, "Failed to load " SymGetLineFromAddrName " from DbgHelp.dll.\n");
goto done;
}
HANDLE process = GetCurrentProcess();
AWS_FATAL_ASSERT(process);
s_SymInitialize(process, NULL, TRUE);
s_SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_ANYTHING | SYMOPT_LOAD_LINES);
return;
done:
if (dbghelp) {
FreeLibrary(dbghelp);
}
return;
}