代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/openjdk-1.8.0 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From b48d4df404756872fb7b1ef7be5f9880ba6a0abc Mon Sep 17 00:00:00 2001
From: zhangyunbo <zhangyunbo7@huawei.com>
Date: Sun, 29 Jan 2023 10:44:01 +0800
Subject: [PATCH 07/15] 8074354: Make CreateMinidumpOnCrash a new name and
available on all platforms
DTS/AR: AR.SR.ccd816c9.001
Summary: <JDK> :8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
LLT: NA
Patch Type: backport
Bug url: https://bugs.openjdk.org/browse/JDK-8074354
---
hotspot/src/os/aix/vm/os_aix.cpp | 4 +
hotspot/src/os/bsd/vm/os_bsd.cpp | 4 +
hotspot/src/os/linux/vm/os_linux.cpp | 4 +
hotspot/src/os/posix/vm/os_posix.cpp | 4 +-
hotspot/src/os/solaris/vm/os_solaris.cpp | 4 +
hotspot/src/os/windows/vm/os_windows.cpp | 117 +++++++++---------
hotspot/src/share/vm/runtime/arguments.cpp | 9 ++
hotspot/src/share/vm/runtime/globals.hpp | 4 +-
hotspot/src/share/vm/runtime/os.hpp | 10 +-
hotspot/src/share/vm/utilities/vmError.cpp | 19 +--
hotspot/src/share/vm/utilities/vmError.hpp | 6 +-
hotspot/test/runtime/Unsafe/RangeCheck.java | 1 +
.../runtime/memory/ReadFromNoaccessArea.java | 1 +
.../test/runtime/memory/ReserveMemory.java | 1 +
14 files changed, 111 insertions(+), 77 deletions(-)
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 519b08550..6838f33bc 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -1214,6 +1214,10 @@ void os::shutdown() {
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
void os::abort(bool dump_core) {
+ abort(dump_core, NULL, NULL);
+}
+
+void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
#ifndef PRODUCT
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index 85e28619c..765b60c0d 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -1147,6 +1147,10 @@ void os::shutdown() {
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
void os::abort(bool dump_core) {
+ abort(dump_core, NULL, NULL);
+}
+
+void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
#ifndef PRODUCT
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index b82352c9f..05c8b254c 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -1588,6 +1588,10 @@ void os::shutdown() {
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
void os::abort(bool dump_core) {
+ abort(dump_core, NULL, NULL);
+}
+
+void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
#ifndef PRODUCT
diff --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp
index d2663bd86..678a1059f 100644
--- a/hotspot/src/os/posix/vm/os_posix.cpp
+++ b/hotspot/src/os/posix/vm/os_posix.cpp
@@ -48,7 +48,7 @@ PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
#define ROOT_UID 0
// Check core dump limit and report possible place where core can be found
-void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
+void os::check_dump_limit(char* buffer, size_t bufferSize) {
int n;
struct rlimit rlim;
bool success;
@@ -74,7 +74,7 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
break;
}
}
- VMError::report_coredump_status(buffer, success);
+ VMError::record_coredump_status(buffer, success);
}
int os::get_native_stack(address* stack, int frames, int toSkip) {
diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp
index d995f51e3..9f8c6a9bf 100644
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp
@@ -1581,6 +1581,10 @@ void os::shutdown() {
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
void os::abort(bool dump_core) {
+ abort(dump_core, NULL, NULL);
+}
+
+void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
#ifndef PRODUCT
diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp
index 23dec5b67..11bd14f6f 100644
--- a/hotspot/src/os/windows/vm/os_windows.cpp
+++ b/hotspot/src/os/windows/vm/os_windows.cpp
@@ -980,7 +980,43 @@ void os::shutdown() {
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) {
+static HANDLE dumpFile = NULL;
+
+// Check if dump file can be created.
+void os::check_dump_limit(char* buffer, size_t buffsz) {
+ bool status = true;
+ if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
+ jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line");
+ status = false;
+ }
+
+#ifndef ASSERT
+ if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
+ jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows");
+ status = false;
+ }
+#endif
+
+ if (status) {
+ const char* cwd = get_current_directory(NULL, 0);
+ int pid = current_process_id();
+ if (cwd != NULL) {
+ jio_snprintf(buffer, buffsz, "%s\\hs_err_pid%u.mdmp", cwd, pid);
+ } else {
+ jio_snprintf(buffer, buffsz, ".\\hs_err_pid%u.mdmp", pid);
+ }
+
+ if (dumpFile == NULL &&
+ (dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
+ == INVALID_HANDLE_VALUE) {
+ jio_snprintf(buffer, buffsz, "Failed to create minidump file (0x%x).", GetLastError());
+ status = false;
+ }
+ }
+ VMError::record_coredump_status(buffer, status);
+}
+
+void os::abort(bool dump_core, void* siginfo, void* context) {
HINSTANCE dbghelp;
EXCEPTION_POINTERS ep;
MINIDUMP_EXCEPTION_INFORMATION mei;
@@ -988,33 +1024,22 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
HANDLE hProcess = GetCurrentProcess();
DWORD processId = GetCurrentProcessId();
- HANDLE dumpFile;
MINIDUMP_TYPE dumpType;
- static const char* cwd;
-// Default is to always create dump for debug builds, on product builds only dump on server versions of Windows.
-#ifndef ASSERT
- // If running on a client version of Windows and user has not explicitly enabled dumping
- if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) {
- VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false);
- return;
- // If running on a server version of Windows and user has explictly disabled dumping
- } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
- VMError::report_coredump_status("Minidump has been disabled from the command line", false);
- return;
- }
-#else
- if (!FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) {
- VMError::report_coredump_status("Minidump has been disabled from the command line", false);
- return;
+ shutdown();
+ if (!dump_core || dumpFile == NULL) {
+ if (dumpFile != NULL) {
+ CloseHandle(dumpFile);
+ }
+ win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
}
-#endif
dbghelp = os::win32::load_Windows_dll("DBGHELP.DLL", NULL, 0);
if (dbghelp == NULL) {
- VMError::report_coredump_status("Failed to load dbghelp.dll", false);
- return;
+ jio_fprintf(stderr, "Failed to load dbghelp.dll\n");
+ CloseHandle(dumpFile);
+ win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
}
_MiniDumpWriteDump = CAST_TO_FN_PTR(
@@ -1023,30 +1048,22 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
GetProcAddress(dbghelp, "MiniDumpWriteDump"));
if (_MiniDumpWriteDump == NULL) {
- VMError::report_coredump_status("Failed to find MiniDumpWriteDump() in module dbghelp.dll", false);
- return;
+ jio_fprintf(stderr, "Failed to find MiniDumpWriteDump() in module dbghelp.dll.\n");
+ CloseHandle(dumpFile);
+ win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
}
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
+ // Older versions of dbghelp.h do not 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);
-
- if (dumpFile == INVALID_HANDLE_VALUE) {
- VMError::report_coredump_status("Failed to create file for dumping", false);
- return;
- }
- if (exceptionRecord != NULL && contextRecord != NULL) {
- ep.ContextRecord = (PCONTEXT) contextRecord;
- ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord;
+ if (siginfo != NULL && context != NULL) {
+ ep.ContextRecord = (PCONTEXT) context;
+ ep.ExceptionRecord = (PEXCEPTION_RECORD) siginfo;
mei.ThreadId = GetCurrentThreadId();
mei.ExceptionPointers = &ep;
@@ -1055,40 +1072,20 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
pmei = NULL;
}
-
// Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
// the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, NULL, NULL) == false &&
_MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == false) {
- DWORD error = GetLastError();
- LPTSTR msgbuf = NULL;
-
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, error, 0, (LPTSTR)&msgbuf, 0, NULL) != 0) {
-
- jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x: %s)", error, msgbuf);
- LocalFree(msgbuf);
- } else {
- // Call to FormatMessage failed, just include the result from GetLastError
- jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x)", error);
- }
- VMError::report_coredump_status(buffer, false);
- } else {
- VMError::report_coredump_status(buffer, true);
+ jio_fprintf(stderr, "Call to MiniDumpWriteDump() failed (Error 0x%x)\n", GetLastError());
}
-
CloseHandle(dumpFile);
+ win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
}
-
void os::abort(bool dump_core)
{
- os::shutdown();
- // no core dump on Windows
- ::exit(1);
+ abort(dump_core, NULL, NULL);
}
// Die immediately, no exit hook, no abort hook, no cleanup.
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index b0b541482..43fdd0b49 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -3599,6 +3599,15 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
} else if (match_jfr_option(&option)) {
return JNI_EINVAL;
#endif
+ // CreateMinidumpOnCrash is removed, and replaced by CreateCoredumpOnCrash
+ } else if (match_option(option, "-XX:+CreateMinidumpOnCrash", &tail)) {
+ FLAG_SET_CMDLINE(bool, CreateCoredumpOnCrash, true);
+ jio_fprintf(defaultStream::output_stream(),
+ "CreateMinidumpOnCrash is replaced by CreateCoredumpOnCrash: CreateCoredumpOnCrash is on\n");
+ } else if (match_option(option, "-XX:-CreateMinidumpOnCrash", &tail)) {
+ FLAG_SET_CMDLINE(bool, CreateCoredumpOnCrash, false);
+ jio_fprintf(defaultStream::output_stream(),
+ "CreateMinidumpOnCrash is replaced by CreateCoredumpOnCrash: CreateCoredumpOnCrash is off\n");
} else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx
// Skip -XX:Flags= since that case has already been handled
if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) {
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 3dd4c51a9..3b2776ce5 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -948,8 +948,8 @@ class CommandLineFlags {
product(bool, ShowMessageBoxOnError, false, \
"Keep process alive on VM fatal error") \
\
- product(bool, CreateMinidumpOnCrash, false, \
- "Create minidump on VM fatal error") \
+ product(bool, CreateCoredumpOnCrash, true, \
+ "Create core/mini dump on VM fatal error") \
\
product_pd(bool, UseOSErrorReporting, \
"Let VM fatal error propagate to the OS (ie. WER on Windows)") \
diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp
index 092459c99..e696321ab 100644
--- a/hotspot/src/share/vm/runtime/os.hpp
+++ b/hotspot/src/share/vm/runtime/os.hpp
@@ -553,6 +553,7 @@ class os: AllStatic {
// Terminate with an error. Default is to generate a core file on platforms
// that support such things. This calls shutdown() and then aborts.
+ static void abort(bool dump_core, void *siginfo, void *context);
static void abort(bool dump_core = true);
// Die immediately, no exit hook, no abort hook, no cleanup.
@@ -803,8 +804,13 @@ class os: AllStatic {
// Structured OS Exception support
static void os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
- // On Windows this will create an actual minidump, on Linux/Solaris it will simply check core dump limits
- static void check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize);
+ // On Posix compatible OS it will simply check core dump limits while on Windows
+ // it will check if dump file can be created. Check or prepare a core dump to be
+ // taken at a later point in the same thread in os::abort(). Use the caller
+ // provided buffer as a scratch buffer. The status message which will be written
+ // into the error log either is file location or a short error message, depending
+ // on the checking result.
+ static void check_dump_limit(char* buffer, size_t bufferSize);
// Get the default path to the core file
// Returns the length of the string
diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp
index 26408fa5e..56ae50fe5 100644
--- a/hotspot/src/share/vm/utilities/vmError.cpp
+++ b/hotspot/src/share/vm/utilities/vmError.cpp
@@ -220,7 +220,7 @@ static void print_bug_submit_message(outputStream *out, Thread *thread) {
bool VMError::coredump_status;
char VMError::coredump_message[O_BUFLEN];
-void VMError::report_coredump_status(const char* message, bool status) {
+void VMError::record_coredump_status(const char* message, bool status) {
coredump_status = status;
strncpy(coredump_message, message, sizeof(coredump_message));
coredump_message[sizeof(coredump_message)-1] = 0;
@@ -533,10 +533,14 @@ void VMError::report(outputStream* st) {
}
STEP(63, "(printing core file information)")
st->print("# ");
- if (coredump_status) {
- st->print("Core dump written. Default location: %s", coredump_message);
+ if (CreateCoredumpOnCrash) {
+ if (coredump_status) {
+ st->print("Core dump will be written. %s", coredump_message);
+ } else {
+ st->print("No core dump will be written. %s", coredump_message);
+ }
} else {
- st->print("Failed to write core dump. %s", coredump_message);
+ st->print("CreateCoredumpOnCrash turned off, no core file dumped");
}
st->cr();
st->print_cr("#");
@@ -944,7 +948,7 @@ void VMError::report_and_die() {
static bool transmit_report_done = false; // done error reporting
if (SuppressFatalErrorMessage) {
- os::abort();
+ os::abort(CreateCoredumpOnCrash);
}
jlong mytid = os::current_thread_id();
if (first_error == NULL &&
@@ -962,8 +966,7 @@ void VMError::report_and_die() {
ShowMessageBoxOnError = false;
}
- // Write a minidump on Windows, check core dump limits on Linux/Solaris
- os::check_or_create_dump(_siginfo, _context, buffer, sizeof(buffer));
+ os::check_dump_limit(buffer, sizeof(buffer));
// reset signal handlers or exception filter; make sure recursive crashes
// are handled properly.
@@ -1153,7 +1156,7 @@ void VMError::report_and_die() {
if (!skip_os_abort) {
skip_os_abort = true;
bool dump_core = should_report_bug(first_error->_id);
- os::abort(dump_core);
+ os::abort(dump_core && CreateCoredumpOnCrash, _siginfo, _context);
}
// if os::abort() doesn't abort, try os::die();
diff --git a/hotspot/src/share/vm/utilities/vmError.hpp b/hotspot/src/share/vm/utilities/vmError.hpp
index 21db84d0c..dc455c6fa 100644
--- a/hotspot/src/share/vm/utilities/vmError.hpp
+++ b/hotspot/src/share/vm/utilities/vmError.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -117,8 +117,8 @@ public:
// return a string to describe the error
char *error_string(char* buf, int buflen);
- // Report status of core/minidump
- static void report_coredump_status(const char* message, bool status);
+ // Record status of core/minidump
+ static void record_coredump_status(const char* message, bool status);
// main error reporting function
void report_and_die();
diff --git a/hotspot/test/runtime/Unsafe/RangeCheck.java b/hotspot/test/runtime/Unsafe/RangeCheck.java
index 9ded944cb..602f22500 100644
--- a/hotspot/test/runtime/Unsafe/RangeCheck.java
+++ b/hotspot/test/runtime/Unsafe/RangeCheck.java
@@ -43,6 +43,7 @@ public class RangeCheck {
true,
"-Xmx32m",
"-XX:-TransmitErrorReport",
+ "-XX:-CreateCoredumpOnCrash",
DummyClassWithMainRangeCheck.class.getName());
OutputAnalyzer output = new OutputAnalyzer(pb.start());
diff --git a/hotspot/test/runtime/memory/ReadFromNoaccessArea.java b/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
index 1078dd2e4..b2a58ae0a 100644
--- a/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
+++ b/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
@@ -45,6 +45,7 @@ public class ReadFromNoaccessArea {
"-Xbootclasspath/a:.",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
+ "-XX:-CreateCoredumpOnCrash",
"-XX:+UseCompressedOops",
"-XX:HeapBaseMinAddress=33G",
DummyClassWithMainTryingToReadFromNoaccessArea.class.getName());
diff --git a/hotspot/test/runtime/memory/ReserveMemory.java b/hotspot/test/runtime/memory/ReserveMemory.java
index 9e37d52cc..ef4dde1a7 100644
--- a/hotspot/test/runtime/memory/ReserveMemory.java
+++ b/hotspot/test/runtime/memory/ReserveMemory.java
@@ -57,6 +57,7 @@ public class ReserveMemory {
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:-TransmitErrorReport",
+ "-XX:-CreateCoredumpOnCrash",
"ReserveMemory",
"test");
--
2.19.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。