8004124: Handle and/or warn about SI_KERNEL
Summary: Detect this crash in the signal handler and give a fatal error message instead of making us chase down bugs that don't reproduce
Reviewed-by: kvn, mgerdin, dholmes
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Jun 20 11:53:51 2013 +0200
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Fri Jun 21 10:50:19 2013 -0400
@@ -289,6 +289,16 @@
}
#endif // AMD64
+#ifndef AMD64
+ // Halt if SI_KERNEL before more crashes get misdiagnosed as Java bugs
+ // This can happen in any running code (currently more frequently in
+ // interpreter code but has been seen in compiled code)
+ if (sig == SIGSEGV && info->si_addr == 0 && info->si_code == SI_KERNEL) {
+ fatal("An irrecoverable SI_KERNEL SIGSEGV has occurred due "
+ "to unstable signal handling in this distribution.");
+ }
+#endif // AMD64
+
// Handle ALL stack overflow variations here
if (sig == SIGSEGV) {
address addr = (address) info->si_addr;
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Jun 20 11:53:51 2013 +0200
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Fri Jun 21 10:50:19 2013 -0400
@@ -813,8 +813,11 @@
// 3. Implict null exception in nmethod
if (!cb->is_nmethod()) {
- guarantee(cb->is_adapter_blob() || cb->is_method_handles_adapter_blob(),
- "exception happened outside interpreter, nmethods and vtable stubs (1)");
+ bool is_in_blob = cb->is_adapter_blob() || cb->is_method_handles_adapter_blob();
+ if (!is_in_blob) {
+ cb->print();
+ fatal(err_msg("exception happened outside interpreter, nmethods and vtable stubs at pc " INTPTR_FORMAT, pc));
+ }
Events::log_exception(thread, "NullPointerException in code blob at " INTPTR_FORMAT, pc);
// There is no handler here, so we will simply unwind.
return StubRoutines::throw_NullPointerException_at_call_entry();