< 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,15 +980,18 @@
if (abort_hook != NULL) {
abort_hook();
}
}
-
-static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE,
+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,31 +1026,32 @@
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);
+ _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 API_VERSION_NUMBER >= 11
+ // 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);
-#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);
< prev index next >