--- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Nov 18 22:00:09 2015 +0000
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Nov 25 16:33:28 2015 +0100
@@ -4970,7 +4970,7 @@
void os::print_statistics() {
}
-int os::message_box(const char* title, const char* message) {
+bool os::message_box(const char* title, const char* message) {
int i;
fdStream err(defaultStream::error_fd());
for (i = 0; i < 78; i++) err.print_raw("=");
@@ -5995,6 +5995,34 @@
return strlen(buffer);
}
+bool os::start_debugging(char *buf, int buflen) {
+ int len = (int)strlen(buf);
+ char *p = &buf[len];
+
+ jio_snprintf(p, buflen-len,
+ "\n\n"
+ "Do you want to debug the problem?\n\n"
+ "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " UINTX_FORMAT " (" INTPTR_FORMAT ")\n"
+ "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
+ "Otherwise, press RETURN to abort...",
+ os::current_process_id(), os::current_process_id(),
+ os::current_thread_id(), os::current_thread_id());
+
+ bool yes = os::message_box("Unexpected Error", buf);
+
+ if (yes) {
+ // yes, user asked VM to launch debugger
+ jio_snprintf(buf, sizeof(buf), "gdb /proc/%d/exe %d",
+ os::current_process_id(), os::current_process_id());
+
+ os::fork_and_exec(buf);
+ yes = false;
+ }
+ return yes;
+}
+
+
+
/////////////// Unit tests ///////////////
#ifndef PRODUCT