< 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 >