< prev index next >

src/os/windows/vm/os_windows.cpp

Print this page
rev 7972 : 8075044: Query dbghelp.dll version number at run time, not at compile time
Summary: use ImagehlpApiVersion() instead of API_VERSION_NUMBER to determine dbghelp.dll version
Contributed-by: Thomas Stuefe

*** 980,994 **** if (abort_hook != NULL) { abort_hook(); } } ! ! static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { HINSTANCE dbghelp; EXCEPTION_POINTERS ep; MINIDUMP_EXCEPTION_INFORMATION mei; --- 980,997 ---- if (abort_hook != NULL) { abort_hook(); } } ! typedef BOOL (WINAPI *fun_MiniDumpWriteDump_t) (HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); + typedef LPAPI_VERSION (WINAPI *fun_ImagehlpApiVersion_t) (VOID); + + static fun_MiniDumpWriteDump_t _MiniDumpWriteDump; + static fun_ImagehlpApiVersion_t _ImagehlpApiVersion; void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { HINSTANCE dbghelp; EXCEPTION_POINTERS ep; MINIDUMP_EXCEPTION_INFORMATION mei;
*** 1023,1053 **** if (dbghelp == NULL) { VMError::report_coredump_status("Failed to load dbghelp.dll", false); return; } - _MiniDumpWriteDump = - CAST_TO_FN_PTR(BOOL(WINAPI *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, - PMINIDUMP_EXCEPTION_INFORMATION, - PMINIDUMP_USER_STREAM_INFORMATION, - PMINIDUMP_CALLBACK_INFORMATION), - GetProcAddress(dbghelp, - "MiniDumpWriteDump")); - if (_MiniDumpWriteDump == NULL) { ! VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false); return; } dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData); ! // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with ! // API_VERSION_NUMBER 11 or higher contains the ones we want though ! #if API_VERSION_NUMBER >= 11 dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); ! #endif cwd = get_current_directory(NULL, 0); jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", cwd, current_process_id()); dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); --- 1026,1057 ---- if (dbghelp == NULL) { VMError::report_coredump_status("Failed to load dbghelp.dll", false); return; } if (_MiniDumpWriteDump == NULL) { ! _MiniDumpWriteDump = ! CAST_TO_FN_PTR(fun_MiniDumpWriteDump_t, GetProcAddress(dbghelp, "MiniDumpWriteDump")); ! _ImagehlpApiVersion = ! CAST_TO_FN_PTR(fun_ImagehlpApiVersion_t, GetProcAddress(dbghelp, "ImagehlpApiVersion")); ! if (_MiniDumpWriteDump == NULL || _ImagehlpApiVersion == NULL) { ! VMError::report_coredump_status("Failed to find MiniDumpWriteDump() or ImagehlpApiVersion() " ! "in module dbghelp.dll", false); return; } + } + + const API_VERSION* const version = _ImagehlpApiVersion(); dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData); ! // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with ! // API_VERSION_NUMBER 11 or higher contains the ones we want though ! if (version->MajorVersion >= 11) { dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); ! } cwd = get_current_directory(NULL, 0); jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", cwd, current_process_id()); dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
< prev index next >