src/share/vm/utilities/vmError.cpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 855
a1980da045cc
child 908
3ad2b8576c4a
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

duke@435 1 /*
xdono@631 2 * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_vmError.cpp.incl"
duke@435 27
duke@435 28 // List of environment variables that should be reported in error log file.
duke@435 29 const char *env_list[] = {
duke@435 30 // All platforms
duke@435 31 "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
duke@435 32 "JAVA_COMPILER", "PATH", "USERNAME",
duke@435 33
duke@435 34 // Env variables that are defined on Solaris/Linux
duke@435 35 "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
duke@435 36 "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
duke@435 37
duke@435 38 // defined on Linux
duke@435 39 "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
duke@435 40
duke@435 41 // defined on Windows
duke@435 42 "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
duke@435 43
duke@435 44 (const char *)0
duke@435 45 };
duke@435 46
duke@435 47 // Fatal error handler for internal errors and crashes.
duke@435 48 //
duke@435 49 // The default behavior of fatal error handler is to print a brief message
duke@435 50 // to standard out (defaultStream::output_fd()), then save detailed information
duke@435 51 // into an error report file (hs_err_pid<pid>.log) and abort VM. If multiple
duke@435 52 // threads are having troubles at the same time, only one error is reported.
duke@435 53 // The thread that is reporting error will abort VM when it is done, all other
duke@435 54 // threads are blocked forever inside report_and_die().
duke@435 55
duke@435 56 // Constructor for crashes
duke@435 57 VMError::VMError(Thread* thread, int sig, address pc, void* siginfo, void* context) {
duke@435 58 _thread = thread;
duke@435 59 _id = sig;
duke@435 60 _pc = pc;
duke@435 61 _siginfo = siginfo;
duke@435 62 _context = context;
duke@435 63
duke@435 64 _verbose = false;
duke@435 65 _current_step = 0;
duke@435 66 _current_step_info = NULL;
duke@435 67
duke@435 68 _message = "";
duke@435 69 _filename = NULL;
duke@435 70 _lineno = 0;
duke@435 71
duke@435 72 _size = 0;
duke@435 73 }
duke@435 74
duke@435 75 // Constructor for internal errors
duke@435 76 VMError::VMError(Thread* thread, const char* message, const char* filename, int lineno) {
duke@435 77 _thread = thread;
duke@435 78 _id = internal_error; // set it to a value that's not an OS exception/signal
duke@435 79 _filename = filename;
duke@435 80 _lineno = lineno;
duke@435 81 _message = message;
duke@435 82
duke@435 83 _verbose = false;
duke@435 84 _current_step = 0;
duke@435 85 _current_step_info = NULL;
duke@435 86
duke@435 87 _pc = NULL;
duke@435 88 _siginfo = NULL;
duke@435 89 _context = NULL;
duke@435 90
duke@435 91 _size = 0;
duke@435 92 }
duke@435 93
duke@435 94 // Constructor for OOM errors
duke@435 95 VMError::VMError(Thread* thread, size_t size, const char* message, const char* filename, int lineno) {
duke@435 96 _thread = thread;
duke@435 97 _id = oom_error; // set it to a value that's not an OS exception/signal
duke@435 98 _filename = filename;
duke@435 99 _lineno = lineno;
duke@435 100 _message = message;
duke@435 101
duke@435 102 _verbose = false;
duke@435 103 _current_step = 0;
duke@435 104 _current_step_info = NULL;
duke@435 105
duke@435 106 _pc = NULL;
duke@435 107 _siginfo = NULL;
duke@435 108 _context = NULL;
duke@435 109
duke@435 110 _size = size;
duke@435 111 }
duke@435 112
duke@435 113
duke@435 114 // Constructor for non-fatal errors
duke@435 115 VMError::VMError(const char* message) {
duke@435 116 _thread = NULL;
duke@435 117 _id = internal_error; // set it to a value that's not an OS exception/signal
duke@435 118 _filename = NULL;
duke@435 119 _lineno = 0;
duke@435 120 _message = message;
duke@435 121
duke@435 122 _verbose = false;
duke@435 123 _current_step = 0;
duke@435 124 _current_step_info = NULL;
duke@435 125
duke@435 126 _pc = NULL;
duke@435 127 _siginfo = NULL;
duke@435 128 _context = NULL;
duke@435 129
duke@435 130 _size = 0;
duke@435 131 }
duke@435 132
duke@435 133 // -XX:OnError=<string>, where <string> can be a list of commands, separated
duke@435 134 // by ';'. "%p" is replaced by current process id (pid); "%%" is replaced by
duke@435 135 // a single "%". Some examples:
duke@435 136 //
duke@435 137 // -XX:OnError="pmap %p" // show memory map
duke@435 138 // -XX:OnError="gcore %p; dbx - %p" // dump core and launch debugger
duke@435 139 // -XX:OnError="cat hs_err_pid%p.log | mail my_email@sun.com"
duke@435 140 // -XX:OnError="kill -9 %p" // ?#!@#
duke@435 141
duke@435 142 // A simple parser for -XX:OnError, usage:
duke@435 143 // ptr = OnError;
duke@435 144 // while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr) != NULL)
duke@435 145 // ... ...
duke@435 146 static char* next_OnError_command(char* buf, int buflen, const char** ptr) {
duke@435 147 if (ptr == NULL || *ptr == NULL) return NULL;
duke@435 148
duke@435 149 const char* cmd = *ptr;
duke@435 150
duke@435 151 // skip leading blanks or ';'
duke@435 152 while (*cmd == ' ' || *cmd == ';') cmd++;
duke@435 153
duke@435 154 if (*cmd == '\0') return NULL;
duke@435 155
duke@435 156 const char * cmdend = cmd;
duke@435 157 while (*cmdend != '\0' && *cmdend != ';') cmdend++;
duke@435 158
duke@435 159 Arguments::copy_expand_pid(cmd, cmdend - cmd, buf, buflen);
duke@435 160
duke@435 161 *ptr = (*cmdend == '\0' ? cmdend : cmdend + 1);
duke@435 162 return buf;
duke@435 163 }
duke@435 164
duke@435 165
duke@435 166 static void print_bug_submit_message(outputStream *out, Thread *thread) {
duke@435 167 if (out == NULL) return;
duke@435 168 out->print_raw_cr("# If you would like to submit a bug report, please visit:");
duke@435 169 out->print_raw ("# ");
duke@435 170 out->print_raw_cr(Arguments::java_vendor_url_bug());
duke@435 171 // If the crash is in native code, encourage user to submit a bug to the
duke@435 172 // provider of that code.
coleenp@491 173 if (thread && thread->is_Java_thread() &&
coleenp@491 174 !thread->is_hidden_from_external_view()) {
duke@435 175 JavaThread* jt = (JavaThread*)thread;
duke@435 176 if (jt->thread_state() == _thread_in_native) {
duke@435 177 out->print_cr("# The crash happened outside the Java Virtual Machine in native code.\n# See problematic frame for where to report the bug.");
duke@435 178 }
duke@435 179 }
duke@435 180 out->print_raw_cr("#");
duke@435 181 }
duke@435 182
duke@435 183
duke@435 184 // Return a string to describe the error
duke@435 185 char* VMError::error_string(char* buf, int buflen) {
duke@435 186 char signame_buf[64];
duke@435 187 const char *signame = os::exception_name(_id, signame_buf, sizeof(signame_buf));
duke@435 188
duke@435 189 if (signame) {
duke@435 190 jio_snprintf(buf, buflen,
duke@435 191 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" UINTX_FORMAT,
duke@435 192 signame, _id, _pc,
duke@435 193 os::current_process_id(), os::current_thread_id());
duke@435 194 } else {
duke@435 195 if (_filename != NULL && _lineno > 0) {
duke@435 196 // skip directory names
duke@435 197 char separator = os::file_separator()[0];
duke@435 198 const char *p = strrchr(_filename, separator);
duke@435 199
duke@435 200 jio_snprintf(buf, buflen,
duke@435 201 "Internal Error at %s:%d, pid=%d, tid=" UINTX_FORMAT " \nError: %s",
duke@435 202 p ? p + 1 : _filename, _lineno,
duke@435 203 os::current_process_id(), os::current_thread_id(),
duke@435 204 _message ? _message : "");
duke@435 205 } else {
duke@435 206 jio_snprintf(buf, buflen,
duke@435 207 "Internal Error (0x%x), pid=%d, tid=" UINTX_FORMAT,
duke@435 208 _id, os::current_process_id(), os::current_thread_id());
duke@435 209 }
duke@435 210 }
duke@435 211
duke@435 212 return buf;
duke@435 213 }
duke@435 214
duke@435 215
duke@435 216 // This is the main function to report a fatal error. Only one thread can
duke@435 217 // call this function, so we don't need to worry about MT-safety. But it's
duke@435 218 // possible that the error handler itself may crash or die on an internal
duke@435 219 // error, for example, when the stack/heap is badly damaged. We must be
duke@435 220 // able to handle recursive errors that happen inside error handler.
duke@435 221 //
duke@435 222 // Error reporting is done in several steps. If a crash or internal error
duke@435 223 // occurred when reporting an error, the nested signal/exception handler
duke@435 224 // can skip steps that are already (or partially) done. Error reporting will
duke@435 225 // continue from the next step. This allows us to retrieve and print
duke@435 226 // information that may be unsafe to get after a fatal error. If it happens,
duke@435 227 // you may find nested report_and_die() frames when you look at the stack
duke@435 228 // in a debugger.
duke@435 229 //
duke@435 230 // In general, a hang in error handler is much worse than a crash or internal
duke@435 231 // error, as it's harder to recover from a hang. Deadlock can happen if we
duke@435 232 // try to grab a lock that is already owned by current thread, or if the
duke@435 233 // owner is blocked forever (e.g. in os::infinite_sleep()). If possible, the
duke@435 234 // error handler and all the functions it called should avoid grabbing any
duke@435 235 // lock. An important thing to notice is that memory allocation needs a lock.
duke@435 236 //
duke@435 237 // We should avoid using large stack allocated buffers. Many errors happen
duke@435 238 // when stack space is already low. Making things even worse is that there
duke@435 239 // could be nested report_and_die() calls on stack (see above). Only one
duke@435 240 // thread can report error, so large buffers are statically allocated in data
duke@435 241 // segment.
duke@435 242
duke@435 243 void VMError::report(outputStream* st) {
duke@435 244 # define BEGIN if (_current_step == 0) { _current_step = 1;
duke@435 245 # define STEP(n, s) } if (_current_step < n) { _current_step = n; _current_step_info = s;
duke@435 246 # define END }
duke@435 247
duke@435 248 // don't allocate large buffer on stack
duke@435 249 static char buf[O_BUFLEN];
duke@435 250
duke@435 251 BEGIN
duke@435 252
coleenp@491 253 STEP(10, "(printing fatal error message)")
duke@435 254
duke@435 255 st->print_cr("#");
coleenp@491 256 st->print_cr("# A fatal error has been detected by the Java Runtime Environment:");
duke@435 257
duke@435 258 STEP(15, "(printing type of error)")
duke@435 259
duke@435 260 switch(_id) {
duke@435 261 case oom_error:
duke@435 262 st->print_cr("#");
duke@435 263 st->print("# java.lang.OutOfMemoryError: ");
duke@435 264 if (_size) {
duke@435 265 st->print("requested ");
kvn@855 266 sprintf(buf,SIZE_FORMAT,_size);
duke@435 267 st->print(buf);
duke@435 268 st->print(" bytes");
duke@435 269 if (_message != NULL) {
duke@435 270 st->print(" for ");
duke@435 271 st->print(_message);
duke@435 272 }
duke@435 273 st->print_cr(". Out of swap space?");
duke@435 274 } else {
duke@435 275 if (_message != NULL)
duke@435 276 st->print_cr(_message);
duke@435 277 }
duke@435 278 break;
duke@435 279 case internal_error:
duke@435 280 default:
duke@435 281 break;
duke@435 282 }
duke@435 283
duke@435 284 STEP(20, "(printing exception/signal name)")
duke@435 285
duke@435 286 st->print_cr("#");
duke@435 287 st->print("# ");
duke@435 288 // Is it an OS exception/signal?
duke@435 289 if (os::exception_name(_id, buf, sizeof(buf))) {
duke@435 290 st->print("%s", buf);
duke@435 291 st->print(" (0x%x)", _id); // signal number
duke@435 292 st->print(" at pc=" PTR_FORMAT, _pc);
duke@435 293 } else {
duke@435 294 st->print("Internal Error");
duke@435 295 if (_filename != NULL && _lineno > 0) {
duke@435 296 #ifdef PRODUCT
duke@435 297 // In product mode chop off pathname?
duke@435 298 char separator = os::file_separator()[0];
duke@435 299 const char *p = strrchr(_filename, separator);
duke@435 300 const char *file = p ? p+1 : _filename;
duke@435 301 #else
duke@435 302 const char *file = _filename;
duke@435 303 #endif
duke@435 304 size_t len = strlen(file);
duke@435 305 size_t buflen = sizeof(buf);
duke@435 306
duke@435 307 strncpy(buf, file, buflen);
duke@435 308 if (len + 10 < buflen) {
duke@435 309 sprintf(buf + len, ":" SIZE_FORMAT, _lineno);
duke@435 310 }
duke@435 311 st->print(" (%s)", buf);
duke@435 312 } else {
duke@435 313 st->print(" (0x%x)", _id);
duke@435 314 }
duke@435 315 }
duke@435 316
duke@435 317 STEP(30, "(printing current thread and pid)")
duke@435 318
duke@435 319 // process id, thread id
duke@435 320 st->print(", pid=%d", os::current_process_id());
duke@435 321 st->print(", tid=" UINTX_FORMAT, os::current_thread_id());
duke@435 322 st->cr();
duke@435 323
duke@435 324 STEP(40, "(printing error message)")
duke@435 325
duke@435 326 // error message
duke@435 327 if (_message && _message[0] != '\0') {
duke@435 328 st->print_cr("# Error: %s", _message);
duke@435 329 }
duke@435 330
duke@435 331 STEP(50, "(printing Java version string)")
duke@435 332
duke@435 333 // VM version
duke@435 334 st->print_cr("#");
coleenp@548 335 st->print_cr("# Java VM: %s (%s %s %s %s)",
duke@435 336 Abstract_VM_Version::vm_name(),
duke@435 337 Abstract_VM_Version::vm_release(),
duke@435 338 Abstract_VM_Version::vm_info_string(),
coleenp@548 339 Abstract_VM_Version::vm_platform_string(),
coleenp@548 340 UseCompressedOops ? "compressed oops" : ""
duke@435 341 );
duke@435 342
duke@435 343 STEP(60, "(printing problematic frame)")
duke@435 344
duke@435 345 // Print current frame if we have a context (i.e. it's a crash)
duke@435 346 if (_context) {
duke@435 347 st->print_cr("# Problematic frame:");
duke@435 348 st->print("# ");
duke@435 349 frame fr = os::fetch_frame_from_context(_context);
duke@435 350 fr.print_on_error(st, buf, sizeof(buf));
duke@435 351 st->cr();
duke@435 352 st->print_cr("#");
duke@435 353 }
duke@435 354
duke@435 355 STEP(65, "(printing bug submit message)")
duke@435 356
duke@435 357 if (_verbose) print_bug_submit_message(st, _thread);
duke@435 358
duke@435 359 STEP(70, "(printing thread)" )
duke@435 360
duke@435 361 if (_verbose) {
duke@435 362 st->cr();
duke@435 363 st->print_cr("--------------- T H R E A D ---------------");
duke@435 364 st->cr();
duke@435 365 }
duke@435 366
duke@435 367 STEP(80, "(printing current thread)" )
duke@435 368
duke@435 369 // current thread
duke@435 370 if (_verbose) {
duke@435 371 if (_thread) {
duke@435 372 st->print("Current thread (" PTR_FORMAT "): ", _thread);
duke@435 373 _thread->print_on_error(st, buf, sizeof(buf));
duke@435 374 st->cr();
duke@435 375 } else {
duke@435 376 st->print_cr("Current thread is native thread");
duke@435 377 }
duke@435 378 st->cr();
duke@435 379 }
duke@435 380
duke@435 381 STEP(90, "(printing siginfo)" )
duke@435 382
duke@435 383 // signal no, signal code, address that caused the fault
duke@435 384 if (_verbose && _siginfo) {
duke@435 385 os::print_siginfo(st, _siginfo);
duke@435 386 st->cr();
duke@435 387 }
duke@435 388
duke@435 389 STEP(100, "(printing registers, top of stack, instructions near pc)")
duke@435 390
duke@435 391 // registers, top of stack, instructions near pc
duke@435 392 if (_verbose && _context) {
duke@435 393 os::print_context(st, _context);
duke@435 394 st->cr();
duke@435 395 }
duke@435 396
duke@435 397 STEP(110, "(printing stack bounds)" )
duke@435 398
duke@435 399 if (_verbose) {
duke@435 400 st->print("Stack: ");
duke@435 401
duke@435 402 address stack_top;
duke@435 403 size_t stack_size;
duke@435 404
duke@435 405 if (_thread) {
duke@435 406 stack_top = _thread->stack_base();
duke@435 407 stack_size = _thread->stack_size();
duke@435 408 } else {
duke@435 409 stack_top = os::current_stack_base();
duke@435 410 stack_size = os::current_stack_size();
duke@435 411 }
duke@435 412
duke@435 413 address stack_bottom = stack_top - stack_size;
duke@435 414 st->print("[" PTR_FORMAT "," PTR_FORMAT "]", stack_bottom, stack_top);
duke@435 415
duke@435 416 frame fr = _context ? os::fetch_frame_from_context(_context)
duke@435 417 : os::current_frame();
duke@435 418
duke@435 419 if (fr.sp()) {
duke@435 420 st->print(", sp=" PTR_FORMAT, fr.sp());
duke@435 421 st->print(", free space=%dk",
duke@435 422 ((intptr_t)fr.sp() - (intptr_t)stack_bottom) >> 10);
duke@435 423 }
duke@435 424
duke@435 425 st->cr();
duke@435 426 }
duke@435 427
duke@435 428 STEP(120, "(printing native stack)" )
duke@435 429
duke@435 430 if (_verbose) {
duke@435 431 frame fr = _context ? os::fetch_frame_from_context(_context)
duke@435 432 : os::current_frame();
duke@435 433
duke@435 434 // see if it's a valid frame
duke@435 435 if (fr.pc()) {
duke@435 436 st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
duke@435 437
duke@435 438 int count = 0;
duke@435 439
duke@435 440 while (count++ < StackPrintLimit) {
duke@435 441 fr.print_on_error(st, buf, sizeof(buf));
duke@435 442 st->cr();
duke@435 443 if (os::is_first_C_frame(&fr)) break;
duke@435 444 fr = os::get_sender_for_C_frame(&fr);
duke@435 445 }
duke@435 446
duke@435 447 if (count > StackPrintLimit) {
duke@435 448 st->print_cr("...<more frames>...");
duke@435 449 }
duke@435 450
duke@435 451 st->cr();
duke@435 452 }
duke@435 453 }
duke@435 454
duke@435 455 STEP(130, "(printing Java stack)" )
duke@435 456
duke@435 457 if (_verbose && _thread && _thread->is_Java_thread()) {
duke@435 458 JavaThread* jt = (JavaThread*)_thread;
duke@435 459 if (jt->has_last_Java_frame()) {
duke@435 460 st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
duke@435 461 for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
duke@435 462 sfs.current()->print_on_error(st, buf, sizeof(buf));
duke@435 463 st->cr();
duke@435 464 }
duke@435 465 }
duke@435 466 }
duke@435 467
duke@435 468 STEP(140, "(printing VM operation)" )
duke@435 469
duke@435 470 if (_verbose && _thread && _thread->is_VM_thread()) {
duke@435 471 VMThread* t = (VMThread*)_thread;
duke@435 472 VM_Operation* op = t->vm_operation();
duke@435 473 if (op) {
duke@435 474 op->print_on_error(st);
duke@435 475 st->cr();
duke@435 476 st->cr();
duke@435 477 }
duke@435 478 }
duke@435 479
duke@435 480 STEP(150, "(printing current compile task)" )
duke@435 481
duke@435 482 if (_verbose && _thread && _thread->is_Compiler_thread()) {
duke@435 483 CompilerThread* t = (CompilerThread*)_thread;
duke@435 484 if (t->task()) {
duke@435 485 st->cr();
duke@435 486 st->print_cr("Current CompileTask:");
duke@435 487 t->task()->print_line_on_error(st, buf, sizeof(buf));
duke@435 488 st->cr();
duke@435 489 }
duke@435 490 }
duke@435 491
duke@435 492 STEP(160, "(printing process)" )
duke@435 493
duke@435 494 if (_verbose) {
duke@435 495 st->cr();
duke@435 496 st->print_cr("--------------- P R O C E S S ---------------");
duke@435 497 st->cr();
duke@435 498 }
duke@435 499
duke@435 500 STEP(170, "(printing all threads)" )
duke@435 501
duke@435 502 // all threads
duke@435 503 if (_verbose && _thread) {
duke@435 504 Threads::print_on_error(st, _thread, buf, sizeof(buf));
duke@435 505 st->cr();
duke@435 506 }
duke@435 507
duke@435 508 STEP(175, "(printing VM state)" )
duke@435 509
duke@435 510 if (_verbose) {
duke@435 511 // Safepoint state
duke@435 512 st->print("VM state:");
duke@435 513
duke@435 514 if (SafepointSynchronize::is_synchronizing()) st->print("synchronizing");
duke@435 515 else if (SafepointSynchronize::is_at_safepoint()) st->print("at safepoint");
duke@435 516 else st->print("not at safepoint");
duke@435 517
duke@435 518 // Also see if error occurred during initialization or shutdown
duke@435 519 if (!Universe::is_fully_initialized()) {
duke@435 520 st->print(" (not fully initialized)");
duke@435 521 } else if (VM_Exit::vm_exited()) {
duke@435 522 st->print(" (shutting down)");
duke@435 523 } else {
duke@435 524 st->print(" (normal execution)");
duke@435 525 }
duke@435 526 st->cr();
duke@435 527 st->cr();
duke@435 528 }
duke@435 529
duke@435 530 STEP(180, "(printing owned locks on error)" )
duke@435 531
duke@435 532 // mutexes/monitors that currently have an owner
duke@435 533 if (_verbose) {
duke@435 534 print_owned_locks_on_error(st);
duke@435 535 st->cr();
duke@435 536 }
duke@435 537
duke@435 538 STEP(190, "(printing heap information)" )
duke@435 539
duke@435 540 if (_verbose && Universe::is_fully_initialized()) {
duke@435 541 // print heap information before vm abort
duke@435 542 Universe::print_on(st);
duke@435 543 st->cr();
duke@435 544 }
duke@435 545
duke@435 546 STEP(200, "(printing dynamic libraries)" )
duke@435 547
duke@435 548 if (_verbose) {
duke@435 549 // dynamic libraries, or memory map
duke@435 550 os::print_dll_info(st);
duke@435 551 st->cr();
duke@435 552 }
duke@435 553
duke@435 554 STEP(210, "(printing VM options)" )
duke@435 555
duke@435 556 if (_verbose) {
duke@435 557 // VM options
duke@435 558 Arguments::print_on(st);
duke@435 559 st->cr();
duke@435 560 }
duke@435 561
duke@435 562 STEP(220, "(printing environment variables)" )
duke@435 563
duke@435 564 if (_verbose) {
duke@435 565 os::print_environment_variables(st, env_list, buf, sizeof(buf));
duke@435 566 st->cr();
duke@435 567 }
duke@435 568
duke@435 569 STEP(225, "(printing signal handlers)" )
duke@435 570
duke@435 571 if (_verbose) {
duke@435 572 os::print_signal_handlers(st, buf, sizeof(buf));
duke@435 573 st->cr();
duke@435 574 }
duke@435 575
duke@435 576 STEP(230, "" )
duke@435 577
duke@435 578 if (_verbose) {
duke@435 579 st->cr();
duke@435 580 st->print_cr("--------------- S Y S T E M ---------------");
duke@435 581 st->cr();
duke@435 582 }
duke@435 583
duke@435 584 STEP(240, "(printing OS information)" )
duke@435 585
duke@435 586 if (_verbose) {
duke@435 587 os::print_os_info(st);
duke@435 588 st->cr();
duke@435 589 }
duke@435 590
duke@435 591 STEP(250, "(printing CPU info)" )
duke@435 592 if (_verbose) {
duke@435 593 os::print_cpu_info(st);
duke@435 594 st->cr();
duke@435 595 }
duke@435 596
duke@435 597 STEP(260, "(printing memory info)" )
duke@435 598
duke@435 599 if (_verbose) {
duke@435 600 os::print_memory_info(st);
duke@435 601 st->cr();
duke@435 602 }
duke@435 603
duke@435 604 STEP(270, "(printing internal vm info)" )
duke@435 605
duke@435 606 if (_verbose) {
duke@435 607 st->print_cr("vm_info: %s", Abstract_VM_Version::internal_vm_info_string());
duke@435 608 st->cr();
duke@435 609 }
duke@435 610
duke@435 611 STEP(280, "(printing date and time)" )
duke@435 612
duke@435 613 if (_verbose) {
duke@435 614 os::print_date_and_time(st);
duke@435 615 st->cr();
duke@435 616 }
duke@435 617
duke@435 618 END
duke@435 619
duke@435 620 # undef BEGIN
duke@435 621 # undef STEP
duke@435 622 # undef END
duke@435 623 }
duke@435 624
duke@435 625
duke@435 626 void VMError::report_and_die() {
duke@435 627 // Don't allocate large buffer on stack
duke@435 628 static char buffer[O_BUFLEN];
duke@435 629
duke@435 630 // First error, and its thread id. We must be able to handle native thread,
duke@435 631 // so use thread id instead of Thread* to identify thread.
duke@435 632 static VMError* first_error;
duke@435 633 static jlong first_error_tid;
duke@435 634
duke@435 635 // An error could happen before tty is initialized or after it has been
duke@435 636 // destroyed. Here we use a very simple unbuffered fdStream for printing.
duke@435 637 // Only out.print_raw() and out.print_raw_cr() should be used, as other
duke@435 638 // printing methods need to allocate large buffer on stack. To format a
duke@435 639 // string, use jio_snprintf() with a static buffer or use staticBufferStream.
duke@435 640 static fdStream out(defaultStream::output_fd());
duke@435 641
duke@435 642 // How many errors occurred in error handler when reporting first_error.
duke@435 643 static int recursive_error_count;
duke@435 644
duke@435 645 // We will first print a brief message to standard out (verbose = false),
duke@435 646 // then save detailed information in log file (verbose = true).
duke@435 647 static bool out_done = false; // done printing to standard out
duke@435 648 static bool log_done = false; // done saving error log
duke@435 649 static fdStream log; // error log
duke@435 650
duke@435 651 if (SuppressFatalErrorMessage) {
duke@435 652 os::abort();
duke@435 653 }
duke@435 654 jlong mytid = os::current_thread_id();
duke@435 655 if (first_error == NULL &&
duke@435 656 Atomic::cmpxchg_ptr(this, &first_error, NULL) == NULL) {
duke@435 657
duke@435 658 // first time
duke@435 659 first_error_tid = mytid;
duke@435 660 set_error_reported();
duke@435 661
duke@435 662 if (ShowMessageBoxOnError) {
duke@435 663 show_message_box(buffer, sizeof(buffer));
duke@435 664
duke@435 665 // User has asked JVM to abort. Reset ShowMessageBoxOnError so the
duke@435 666 // WatcherThread can kill JVM if the error handler hangs.
duke@435 667 ShowMessageBoxOnError = false;
duke@435 668 }
duke@435 669
duke@435 670 // reset signal handlers or exception filter; make sure recursive crashes
duke@435 671 // are handled properly.
duke@435 672 reset_signal_handlers();
duke@435 673
duke@435 674 } else {
duke@435 675 // This is not the first error, see if it happened in a different thread
duke@435 676 // or in the same thread during error reporting.
duke@435 677 if (first_error_tid != mytid) {
duke@435 678 jio_snprintf(buffer, sizeof(buffer),
duke@435 679 "[thread " INT64_FORMAT " also had an error]",
duke@435 680 mytid);
duke@435 681 out.print_raw_cr(buffer);
duke@435 682
duke@435 683 // error reporting is not MT-safe, block current thread
duke@435 684 os::infinite_sleep();
duke@435 685
duke@435 686 } else {
duke@435 687 if (recursive_error_count++ > 30) {
duke@435 688 out.print_raw_cr("[Too many errors, abort]");
duke@435 689 os::die();
duke@435 690 }
duke@435 691
duke@435 692 jio_snprintf(buffer, sizeof(buffer),
duke@435 693 "[error occurred during error reporting %s, id 0x%x]",
duke@435 694 first_error ? first_error->_current_step_info : "",
duke@435 695 _id);
duke@435 696 if (log.is_open()) {
duke@435 697 log.cr();
duke@435 698 log.print_raw_cr(buffer);
duke@435 699 log.cr();
duke@435 700 } else {
duke@435 701 out.cr();
duke@435 702 out.print_raw_cr(buffer);
duke@435 703 out.cr();
duke@435 704 }
duke@435 705 }
duke@435 706 }
duke@435 707
duke@435 708 // print to screen
duke@435 709 if (!out_done) {
duke@435 710 first_error->_verbose = false;
duke@435 711
duke@435 712 staticBufferStream sbs(buffer, sizeof(buffer), &out);
duke@435 713 first_error->report(&sbs);
duke@435 714
duke@435 715 out_done = true;
duke@435 716
duke@435 717 first_error->_current_step = 0; // reset current_step
duke@435 718 first_error->_current_step_info = ""; // reset current_step string
duke@435 719 }
duke@435 720
duke@435 721 // print to error log file
duke@435 722 if (!log_done) {
duke@435 723 first_error->_verbose = true;
duke@435 724
duke@435 725 // see if log file is already open
duke@435 726 if (!log.is_open()) {
duke@435 727 // open log file
duke@435 728 int fd = -1;
duke@435 729
duke@435 730 if (ErrorFile != NULL) {
duke@435 731 bool copy_ok =
duke@435 732 Arguments::copy_expand_pid(ErrorFile, strlen(ErrorFile), buffer, sizeof(buffer));
duke@435 733 if (copy_ok) {
duke@435 734 fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
duke@435 735 }
duke@435 736 }
duke@435 737
duke@435 738 if (fd == -1) {
duke@435 739 const char *cwd = os::get_current_directory(buffer, sizeof(buffer));
duke@435 740 size_t len = strlen(cwd);
duke@435 741 // either user didn't specify, or the user's location failed,
duke@435 742 // so use the default name in the current directory
duke@435 743 jio_snprintf(&buffer[len], sizeof(buffer)-len, "%shs_err_pid%u.log",
duke@435 744 os::file_separator(), os::current_process_id());
duke@435 745 fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
duke@435 746 }
duke@435 747
duke@435 748 if (fd == -1) {
duke@435 749 // try temp directory
duke@435 750 const char * tmpdir = os::get_temp_directory();
duke@435 751 jio_snprintf(buffer, sizeof(buffer), "%shs_err_pid%u.log",
duke@435 752 (tmpdir ? tmpdir : ""), os::current_process_id());
duke@435 753 fd = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0666);
duke@435 754 }
duke@435 755
duke@435 756 if (fd != -1) {
duke@435 757 out.print_raw("# An error report file with more information is saved as:\n# ");
duke@435 758 out.print_raw_cr(buffer);
duke@435 759 os::set_error_file(buffer);
duke@435 760
duke@435 761 log.set_fd(fd);
duke@435 762 } else {
duke@435 763 out.print_raw_cr("# Can not save log file, dump to screen..");
duke@435 764 log.set_fd(defaultStream::output_fd());
duke@435 765 }
duke@435 766 }
duke@435 767
duke@435 768 staticBufferStream sbs(buffer, O_BUFLEN, &log);
duke@435 769 first_error->report(&sbs);
duke@435 770 first_error->_current_step = 0; // reset current_step
duke@435 771 first_error->_current_step_info = ""; // reset current_step string
duke@435 772
duke@435 773 if (log.fd() != defaultStream::output_fd()) {
duke@435 774 close(log.fd());
duke@435 775 }
duke@435 776
duke@435 777 log.set_fd(-1);
duke@435 778 log_done = true;
duke@435 779 }
duke@435 780
duke@435 781
duke@435 782 static bool skip_OnError = false;
duke@435 783 if (!skip_OnError && OnError && OnError[0]) {
duke@435 784 skip_OnError = true;
duke@435 785
duke@435 786 out.print_raw_cr("#");
duke@435 787 out.print_raw ("# -XX:OnError=\"");
duke@435 788 out.print_raw (OnError);
duke@435 789 out.print_raw_cr("\"");
duke@435 790
duke@435 791 char* cmd;
duke@435 792 const char* ptr = OnError;
duke@435 793 while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
duke@435 794 out.print_raw ("# Executing ");
duke@435 795 #if defined(LINUX)
duke@435 796 out.print_raw ("/bin/sh -c ");
duke@435 797 #elif defined(SOLARIS)
duke@435 798 out.print_raw ("/usr/bin/sh -c ");
duke@435 799 #endif
duke@435 800 out.print_raw ("\"");
duke@435 801 out.print_raw (cmd);
duke@435 802 out.print_raw_cr("\" ...");
duke@435 803
duke@435 804 os::fork_and_exec(cmd);
duke@435 805 }
duke@435 806
duke@435 807 // done with OnError
duke@435 808 OnError = NULL;
duke@435 809 }
duke@435 810
duke@435 811 static bool skip_bug_url = false;
duke@435 812 if (!skip_bug_url) {
duke@435 813 skip_bug_url = true;
duke@435 814
duke@435 815 out.print_raw_cr("#");
duke@435 816 print_bug_submit_message(&out, _thread);
duke@435 817 }
duke@435 818
duke@435 819 if (!UseOSErrorReporting) {
duke@435 820 // os::abort() will call abort hooks, try it first.
duke@435 821 static bool skip_os_abort = false;
duke@435 822 if (!skip_os_abort) {
duke@435 823 skip_os_abort = true;
duke@435 824 os::abort();
duke@435 825 }
duke@435 826
duke@435 827 // if os::abort() doesn't abort, try os::die();
duke@435 828 os::die();
duke@435 829 }
duke@435 830 }
duke@435 831
duke@435 832 /*
duke@435 833 * OnOutOfMemoryError scripts/commands executed while VM is a safepoint - this
duke@435 834 * ensures utilities such as jmap can observe the process is a consistent state.
duke@435 835 */
duke@435 836 class VM_ReportJavaOutOfMemory : public VM_Operation {
duke@435 837 private:
duke@435 838 VMError *_err;
duke@435 839 public:
duke@435 840 VM_ReportJavaOutOfMemory(VMError *err) { _err = err; }
duke@435 841 VMOp_Type type() const { return VMOp_ReportJavaOutOfMemory; }
duke@435 842 void doit();
duke@435 843 };
duke@435 844
duke@435 845 void VM_ReportJavaOutOfMemory::doit() {
duke@435 846 // Don't allocate large buffer on stack
duke@435 847 static char buffer[O_BUFLEN];
duke@435 848
duke@435 849 tty->print_cr("#");
duke@435 850 tty->print_cr("# java.lang.OutOfMemoryError: %s", _err->message());
duke@435 851 tty->print_cr("# -XX:OnOutOfMemoryError=\"%s\"", OnOutOfMemoryError);
duke@435 852
duke@435 853 // make heap parsability
duke@435 854 Universe::heap()->ensure_parsability(false); // no need to retire TLABs
duke@435 855
duke@435 856 char* cmd;
duke@435 857 const char* ptr = OnOutOfMemoryError;
duke@435 858 while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
duke@435 859 tty->print("# Executing ");
duke@435 860 #if defined(LINUX)
duke@435 861 tty->print ("/bin/sh -c ");
duke@435 862 #elif defined(SOLARIS)
duke@435 863 tty->print ("/usr/bin/sh -c ");
duke@435 864 #endif
duke@435 865 tty->print_cr("\"%s\"...", cmd);
duke@435 866
duke@435 867 os::fork_and_exec(cmd);
duke@435 868 }
duke@435 869 }
duke@435 870
duke@435 871 void VMError::report_java_out_of_memory() {
duke@435 872 if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
duke@435 873 MutexLocker ml(Heap_lock);
duke@435 874 VM_ReportJavaOutOfMemory op(this);
duke@435 875 VMThread::execute(&op);
duke@435 876 }
duke@435 877 }

mercurial