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