hotspot/src/share/vm/utilities/vmError.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14289 aec758622b4b
child 15201 f3d755b11424
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
     2
 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    26
#include "compiler/compileBroker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    27
#include "gc_interface/collectedHeap.hpp"
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
    28
#include "prims/whitebox.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    29
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    30
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "runtime/init.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    32
#include "runtime/os.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    33
#include "runtime/thread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    34
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    35
#include "runtime/vm_operations.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12268
diff changeset
    36
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    37
#include "utilities/debug.hpp"
7447
32c42d627f41 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 7397
diff changeset
    38
#include "utilities/decoder.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    39
#include "utilities/defaultStream.hpp"
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
    40
#include "utilities/errorReporter.hpp"
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
    41
#include "utilities/events.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    42
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    43
#include "utilities/vmError.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// List of environment variables that should be reported in error log file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
const char *env_list[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  // All platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  "JAVA_COMPILER", "PATH", "USERNAME",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    51
  // Env variables that are defined on Solaris/Linux/BSD
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  // defined on Linux
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    58
  // defined on Darwin
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    59
  "DYLD_LIBRARY_PATH", "DYLD_FALLBACK_LIBRARY_PATH",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    60
  "DYLD_FRAMEWORK_PATH", "DYLD_FALLBACK_FRAMEWORK_PATH",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    61
  "DYLD_INSERT_LIBRARIES",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    62
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  // defined on Windows
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  (const char *)0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
// Fatal error handler for internal errors and crashes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
// The default behavior of fatal error handler is to print a brief message
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
// to standard out (defaultStream::output_fd()), then save detailed information
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
// into an error report file (hs_err_pid<pid>.log) and abort VM. If multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// threads are having troubles at the same time, only one error is reported.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
// The thread that is reporting error will abort VM when it is done, all other
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// threads are blocked forever inside report_and_die().
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
// Constructor for crashes
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
    79
VMError::VMError(Thread* thread, unsigned int sig, address pc, void* siginfo, void* context) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    _thread = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    _id = sig;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    _pc   = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    _siginfo = siginfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    _context = context;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
    90
    _message = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
    91
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    _filename = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    _lineno = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// Constructor for internal errors
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
    99
VMError::VMError(Thread* thread, const char* filename, int lineno,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   100
                 const char* message, const char * detail_msg)
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   101
{
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   102
  _thread = thread;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   103
  _id = internal_error;     // Value that's not an OS exception/signal
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   104
  _filename = filename;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   105
  _lineno = lineno;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   106
  _message = message;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   107
  _detail_msg = detail_msg;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   108
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   109
  _verbose = false;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   110
  _current_step = 0;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   111
  _current_step_info = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   112
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   113
  _pc = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   114
  _siginfo = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   115
  _context = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   116
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   117
  _size = 0;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   118
}
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   119
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   120
// Constructor for OOM errors
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   121
VMError::VMError(Thread* thread, const char* filename, int lineno, size_t size,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   122
                 const char* message) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    _thread = thread;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   124
    _id = oom_error;     // Value that's not an OS exception/signal
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    _filename = filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    _lineno = lineno;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    _message = message;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   128
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    _pc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    _siginfo = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    _context = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    _size = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
// Constructor for non-fatal errors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
VMError::VMError(const char* message) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    _thread = NULL;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   145
    _id = internal_error;     // Value that's not an OS exception/signal
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    _filename = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    _lineno = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    _message = message;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   149
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    _pc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    _siginfo = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    _context = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
// -XX:OnError=<string>, where <string> can be a list of commands, separated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
// by ';'. "%p" is replaced by current process id (pid); "%%" is replaced by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
// a single "%". Some examples:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
// -XX:OnError="pmap %p"                // show memory map
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
// -XX:OnError="gcore %p; dbx - %p"     // dump core and launch debugger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
// -XX:OnError="cat hs_err_pid%p.log | mail my_email@sun.com"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
// -XX:OnError="kill -9 %p"             // ?#!@#
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// A simple parser for -XX:OnError, usage:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
//  ptr = OnError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
//  while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr) != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
//     ... ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
static char* next_OnError_command(char* buf, int buflen, const char** ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  if (ptr == NULL || *ptr == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  const char* cmd = *ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // skip leading blanks or ';'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  while (*cmd == ' ' || *cmd == ';') cmd++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  if (*cmd == '\0') return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  const char * cmdend = cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  while (*cmdend != '\0' && *cmdend != ';') cmdend++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  Arguments::copy_expand_pid(cmd, cmdend - cmd, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  *ptr = (*cmdend == '\0' ? cmdend : cmdend + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
static void print_bug_submit_message(outputStream *out, Thread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  if (out == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  out->print_raw_cr("# If you would like to submit a bug report, please visit:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  out->print_raw   ("#   ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  out->print_raw_cr(Arguments::java_vendor_url_bug());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // If the crash is in native code, encourage user to submit a bug to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // provider of that code.
229
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   202
  if (thread && thread->is_Java_thread() &&
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   203
      !thread->is_hidden_from_external_view()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    JavaThread* jt = (JavaThread*)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    if (jt->thread_state() == _thread_in_native) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
      out->print_cr("# The crash happened outside the Java Virtual Machine in native code.\n# See problematic frame for where to report the bug.");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  out->print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   212
bool VMError::coredump_status;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   213
char VMError::coredump_message[O_BUFLEN];
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   214
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   215
void VMError::report_coredump_status(const char* message, bool status) {
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   216
  coredump_status = status;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   217
  strncpy(coredump_message, message, sizeof(coredump_message));
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   218
  coredump_message[sizeof(coredump_message)-1] = 0;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   219
}
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   220
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
// Return a string to describe the error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
char* VMError::error_string(char* buf, int buflen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  char signame_buf[64];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  const char *signame = os::exception_name(_id, signame_buf, sizeof(signame_buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  if (signame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    jio_snprintf(buf, buflen,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
                 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" UINTX_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
                 signame, _id, _pc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
                 os::current_process_id(), os::current_thread_id());
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   232
  } else if (_filename != NULL && _lineno > 0) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   233
    // skip directory names
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   234
    char separator = os::file_separator()[0];
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   235
    const char *p = strrchr(_filename, separator);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   236
    int n = jio_snprintf(buf, buflen,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   237
                         "Internal Error at %s:%d, pid=%d, tid=" UINTX_FORMAT,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   238
                         p ? p + 1 : _filename, _lineno,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   239
                         os::current_process_id(), os::current_thread_id());
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   240
    if (n >= 0 && n < buflen && _message) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   241
      if (_detail_msg) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   242
        jio_snprintf(buf + n, buflen - n, "%s%s: %s",
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   243
                     os::line_separator(), _message, _detail_msg);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   244
      } else {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   245
        jio_snprintf(buf + n, buflen - n, "%sError: %s",
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   246
                     os::line_separator(), _message);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   247
      }
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   248
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  } else {
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   250
    jio_snprintf(buf, buflen,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   251
                 "Internal Error (0x%x), pid=%d, tid=" UINTX_FORMAT,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   252
                 _id, os::current_process_id(), os::current_thread_id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   258
void VMError::print_stack_trace(outputStream* st, JavaThread* jt,
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   259
                                char* buf, int buflen, bool verbose) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   260
#ifdef ZERO
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   261
  if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   262
    // StackFrameStream uses the frame anchor, which may not have
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   263
    // been set up.  This can be done at any time in Zero, however,
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   264
    // so if it hasn't been set up then we just set it up now and
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   265
    // clear it again when we're done.
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   266
    bool has_last_Java_frame = jt->has_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   267
    if (!has_last_Java_frame)
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   268
      jt->set_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   269
    st->print("Java frames:");
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   270
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   271
    // If the top frame is a Shark frame and the frame anchor isn't
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   272
    // set up then it's possible that the information in the frame
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   273
    // is garbage: it could be from a previous decache, or it could
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   274
    // simply have never been written.  So we print a warning...
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   275
    StackFrameStream sfs(jt);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   276
    if (!has_last_Java_frame && !sfs.is_done()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   277
      if (sfs.current()->zeroframe()->is_shark_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   278
        st->print(" (TOP FRAME MAY BE JUNK)");
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   279
      }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   280
    }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   281
    st->cr();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   282
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   283
    // Print the frames
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   284
    for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   285
      sfs.current()->zero_print_on_error(i, st, buf, buflen);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   286
      st->cr();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   287
    }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   288
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   289
    // Reset the frame anchor if necessary
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   290
    if (!has_last_Java_frame)
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   291
      jt->reset_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   292
  }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   293
#else
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   294
  if (jt->has_last_Java_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   295
    st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   296
    for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   297
      sfs.current()->print_on_error(st, buf, buflen, verbose);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   298
      st->cr();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   299
    }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   300
  }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   301
#endif // ZERO
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   302
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
// This is the main function to report a fatal error. Only one thread can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
// call this function, so we don't need to worry about MT-safety. But it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
// possible that the error handler itself may crash or die on an internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
// error, for example, when the stack/heap is badly damaged. We must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
// able to handle recursive errors that happen inside error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
// Error reporting is done in several steps. If a crash or internal error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// occurred when reporting an error, the nested signal/exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// can skip steps that are already (or partially) done. Error reporting will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// continue from the next step. This allows us to retrieve and print
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// information that may be unsafe to get after a fatal error. If it happens,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
// you may find nested report_and_die() frames when you look at the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
// in a debugger.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
// In general, a hang in error handler is much worse than a crash or internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
// error, as it's harder to recover from a hang. Deadlock can happen if we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
// try to grab a lock that is already owned by current thread, or if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
// owner is blocked forever (e.g. in os::infinite_sleep()). If possible, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
// error handler and all the functions it called should avoid grabbing any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
// lock. An important thing to notice is that memory allocation needs a lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
// We should avoid using large stack allocated buffers. Many errors happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
// when stack space is already low. Making things even worse is that there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
// could be nested report_and_die() calls on stack (see above). Only one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
// thread can report error, so large buffers are statically allocated in data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
// segment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
void VMError::report(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
# define BEGIN if (_current_step == 0) { _current_step = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
# define STEP(n, s) } if (_current_step < n) { _current_step = n; _current_step_info = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
# define END }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  // don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  static char buf[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
229
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   341
  STEP(10, "(printing fatal error message)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   343
    st->print_cr("#");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   344
    if (should_report_bug(_id)) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   345
      st->print_cr("# A fatal error has been detected by the Java Runtime Environment:");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   346
    } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   347
      st->print_cr("# There is insufficient memory for the Java "
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   348
                   "Runtime Environment to continue.");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   349
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  STEP(15, "(printing type of error)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
     switch(_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
       case oom_error:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
         if (_size) {
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   356
           st->print("# Native memory allocation (malloc) failed to allocate ");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   357
           jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
           st->print(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
           st->print(" bytes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
           if (_message != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
             st->print(" for ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
             st->print(_message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
           }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   364
           st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
         } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
           if (_message != NULL)
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   367
             st->print("# ");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
             st->print_cr(_message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
         }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   370
         // In error file give some solutions
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   371
         if (_verbose) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   372
           st->print_cr("# Possible reasons:");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   373
           st->print_cr("#   The system is out of physical RAM or swap space");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   374
           st->print_cr("#   In 32 bit mode, the process size limit was hit");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   375
           st->print_cr("# Possible solutions:");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   376
           st->print_cr("#   Reduce memory load on the system");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   377
           st->print_cr("#   Increase physical memory or swap space");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   378
           st->print_cr("#   Check if swap backing store is full");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   379
           st->print_cr("#   Use 64 bit Java on a 64 bit OS");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   380
           st->print_cr("#   Decrease Java heap size (-Xmx/-Xms)");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   381
           st->print_cr("#   Decrease number of Java threads");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   382
           st->print_cr("#   Decrease Java thread stack sizes (-Xss)");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   383
           st->print_cr("#   Set larger code cache with -XX:ReservedCodeCacheSize=");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   384
           st->print_cr("# This output file may be truncated or incomplete.");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   385
         } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   386
           return;  // that's enough for the screen
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   387
         }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
       case internal_error:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
       default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  STEP(20, "(printing exception/signal name)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
     st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
     st->print("#  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
     // Is it an OS exception/signal?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
     if (os::exception_name(_id, buf, sizeof(buf))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
       st->print("%s", buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
       st->print(" (0x%x)", _id);                // signal number
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
       st->print(" at pc=" PTR_FORMAT, _pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
     } else {
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   404
       if (should_report_bug(_id)) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   405
         st->print("Internal Error");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   406
       } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   407
         st->print("Out of Memory Error");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   408
       }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
       if (_filename != NULL && _lineno > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
#ifdef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
         // In product mode chop off pathname?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
         char separator = os::file_separator()[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
         const char *p = strrchr(_filename, separator);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
         const char *file = p ? p+1 : _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
         const char *file = _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
         size_t len = strlen(file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
         size_t buflen = sizeof(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
         strncpy(buf, file, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
         if (len + 10 < buflen) {
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1887
diff changeset
   423
           sprintf(buf + len, ":%d", _lineno);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
         st->print(" (%s)", buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
         st->print(" (0x%x)", _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  STEP(30, "(printing current thread and pid)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
     // process id, thread id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
     st->print(", pid=%d", os::current_process_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
     st->print(", tid=" UINTX_FORMAT, os::current_thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
     st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  STEP(40, "(printing error message)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   440
     if (should_report_bug(_id)) {  // already printed the message.
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   441
       // error message
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   442
       if (_detail_msg) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   443
         st->print_cr("#  %s: %s", _message ? _message : "Error", _detail_msg);
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   444
       } else if (_message) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   445
         st->print_cr("#  Error: %s", _message);
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   446
       }
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   447
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  STEP(50, "(printing Java version string)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
     // VM version
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
     st->print_cr("#");
1660
86be56b9ba46 6689685: Hotspot crash error message should include libraries version
coleenp
parents: 1500
diff changeset
   453
     JDK_Version::current().to_string(buf, sizeof(buf));
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   454
     const char* runtime_name = JDK_Version::runtime_name() != NULL ?
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   455
                                  JDK_Version::runtime_name() : "";
14289
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   456
     const char* runtime_version = JDK_Version::runtime_version() != NULL ?
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   457
                                  JDK_Version::runtime_version() : "";
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   458
     st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   459
     st->print_cr("# Java VM: %s (%s %s %s %s)",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
                   Abstract_VM_Version::vm_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
                   Abstract_VM_Version::vm_release(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
                   Abstract_VM_Version::vm_info_string(),
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   463
                   Abstract_VM_Version::vm_platform_string(),
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   464
                   UseCompressedOops ? "compressed oops" : ""
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
                 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  STEP(60, "(printing problematic frame)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
     // Print current frame if we have a context (i.e. it's a crash)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
     if (_context) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
       st->print_cr("# Problematic frame:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
       st->print("# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
       frame fr = os::fetch_frame_from_context(_context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
       fr.print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
       st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
     }
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   478
  STEP(63, "(printing core file information)")
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   479
    st->print("# ");
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   480
    if (coredump_status) {
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   481
      st->print("Core dump written. Default location: %s", coredump_message);
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   482
    } else {
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   483
      st->print("Failed to write core dump. %s", coredump_message);
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   484
    }
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   485
    st->print_cr("");
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   486
    st->print_cr("#");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  STEP(65, "(printing bug submit message)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   490
     if (should_report_bug(_id) && _verbose) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   491
       print_bug_submit_message(st, _thread);
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   492
     }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  STEP(70, "(printing thread)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
       st->print_cr("---------------  T H R E A D  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  STEP(80, "(printing current thread)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
     // current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
         st->print("Current thread (" PTR_FORMAT "):  ", _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
         _thread->print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
         st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
         st->print_cr("Current thread is native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  STEP(90, "(printing siginfo)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
     // signal no, signal code, address that caused the fault
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
     if (_verbose && _siginfo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
       os::print_siginfo(st, _siginfo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  STEP(100, "(printing registers, top of stack, instructions near pc)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
     // registers, top of stack, instructions near pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
     if (_verbose && _context) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
       os::print_context(st, _context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   532
  STEP(105, "(printing register info)")
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   533
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   534
     // decode register contents if possible
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   535
     if (_verbose && _context && Universe::is_fully_initialized()) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   536
       os::print_register_info(st, _context);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   537
       st->cr();
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   538
     }
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   539
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  STEP(110, "(printing stack bounds)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
       st->print("Stack: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
       address stack_top;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
       size_t stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
          stack_top = _thread->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
          stack_size = _thread->stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
          stack_top = os::current_stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
          stack_size = os::current_stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
       address stack_bottom = stack_top - stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
       st->print("[" PTR_FORMAT "," PTR_FORMAT "]", stack_bottom, stack_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
       if (fr.sp()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
         st->print(",  sp=" PTR_FORMAT, fr.sp());
6179
4846648c4b7b 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 5547
diff changeset
   564
         size_t free_stack_size = pointer_delta(fr.sp(), stack_bottom, 1024);
4846648c4b7b 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 5547
diff changeset
   565
         st->print(",  free space=" SIZE_FORMAT "k", free_stack_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  STEP(120, "(printing native stack)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
       // see if it's a valid frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
       if (fr.pc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
          st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
7447
32c42d627f41 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 7397
diff changeset
   581
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
          int count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
          while (count++ < StackPrintLimit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
             fr.print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
             st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
             if (os::is_first_C_frame(&fr)) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
             fr = os::get_sender_for_C_frame(&fr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
          if (count > StackPrintLimit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
             st->print_cr("...<more frames>...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  STEP(130, "(printing Java stack)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
     if (_verbose && _thread && _thread->is_Java_thread()) {
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   601
       print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   604
  STEP(135, "(printing target Java thread stack)" )
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   605
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   606
     // printing Java thread stack trace if it is involved in GC crash
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   607
     if (_verbose && _thread && (_thread->is_Named_thread())) {
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   608
       JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   609
       if (jt != NULL) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   610
         st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   611
         print_stack_trace(st, jt, buf, sizeof(buf), true);
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   612
       }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   613
     }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   614
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  STEP(140, "(printing VM operation)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
     if (_verbose && _thread && _thread->is_VM_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
        VMThread* t = (VMThread*)_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
        VM_Operation* op = t->vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
        if (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
          op->print_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  STEP(150, "(printing current compile task)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
     if (_verbose && _thread && _thread->is_Compiler_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
        CompilerThread* t = (CompilerThread*)_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
        if (t->task()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
           st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
           st->print_cr("Current CompileTask:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
           t->task()->print_line_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
           st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  STEP(160, "(printing process)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
       st->print_cr("---------------  P R O C E S S  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  STEP(170, "(printing all threads)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
     // all threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
     if (_verbose && _thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
       Threads::print_on_error(st, _thread, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  STEP(175, "(printing VM state)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
       // Safepoint state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
       st->print("VM state:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
       if (SafepointSynchronize::is_synchronizing()) st->print("synchronizing");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
       else if (SafepointSynchronize::is_at_safepoint()) st->print("at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
       else st->print("not at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
       // Also see if error occurred during initialization or shutdown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
       if (!Universe::is_fully_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
         st->print(" (not fully initialized)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
       } else if (VM_Exit::vm_exited()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
         st->print(" (shutting down)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
         st->print(" (normal execution)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  STEP(180, "(printing owned locks on error)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
     // mutexes/monitors that currently have an owner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
       print_owned_locks_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  STEP(190, "(printing heap information)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
     if (_verbose && Universe::is_fully_initialized()) {
10997
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10565
diff changeset
   688
       // Print heap information before vm abort. As we'd like as much
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10565
diff changeset
   689
       // information as possible in the report we ask for the
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10565
diff changeset
   690
       // extended (i.e., more detailed) version.
0be4b3be7197 7099849: G1: include heap region information in hs_err files
tonyp
parents: 10565
diff changeset
   691
       Universe::print_on(st, true /* extended */);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
       st->cr();
12268
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   693
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   694
       Universe::heap()->barrier_set()->print_on(st);
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   695
       st->cr();
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   696
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   697
       st->print_cr("Polling page: " INTPTR_FORMAT, os::get_polling_page());
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   698
       st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   701
  STEP(195, "(printing code cache information)" )
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   702
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   703
     if (_verbose && Universe::is_fully_initialized()) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   704
       // print code cache information before vm abort
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   705
       CodeCache::print_bounds(st);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   706
       st->cr();
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   707
     }
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   708
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   709
  STEP(200, "(printing ring buffers)" )
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   710
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   711
     if (_verbose) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   712
       Events::print_all(st);
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   713
       st->cr();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   714
     }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   715
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   716
  STEP(205, "(printing dynamic libraries)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
       // dynamic libraries, or memory map
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
       os::print_dll_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  STEP(210, "(printing VM options)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
       // VM options
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
       Arguments::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   732
  STEP(215, "(printing warning if internal testing API used)" )
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   733
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   734
     if (WhiteBox::used()) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   735
       st->print_cr("Unsupported internal testing APIs have been used.");
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   736
       st->cr();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   737
     }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   738
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  STEP(220, "(printing environment variables)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
       os::print_environment_variables(st, env_list, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  STEP(225, "(printing signal handlers)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
       os::print_signal_handlers(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  STEP(230, "" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
       st->print_cr("---------------  S Y S T E M  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  STEP(240, "(printing OS information)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
       os::print_os_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  STEP(250, "(printing CPU info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
       os::print_cpu_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  STEP(260, "(printing memory info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
       os::print_memory_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  STEP(270, "(printing internal vm info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
       st->print_cr("vm_info: %s", Abstract_VM_Version::internal_vm_info_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
  STEP(280, "(printing date and time)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
       os::print_date_and_time(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
# undef BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
# undef STEP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
# undef END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   802
VMError* volatile VMError::first_error = NULL;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   803
volatile jlong VMError::first_error_tid = -1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
void VMError::report_and_die() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  // An error could happen before tty is initialized or after it has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  // destroyed. Here we use a very simple unbuffered fdStream for printing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  // Only out.print_raw() and out.print_raw_cr() should be used, as other
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  // printing methods need to allocate large buffer on stack. To format a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  // string, use jio_snprintf() with a static buffer or use staticBufferStream.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  static fdStream out(defaultStream::output_fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  // How many errors occurred in error handler when reporting first_error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  static int recursive_error_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  // We will first print a brief message to standard out (verbose = false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  // then save detailed information in log file (verbose = true).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  static bool out_done = false;         // done printing to standard out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  static bool log_done = false;         // done saving error log
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   823
  static bool transmit_report_done = false; // done error reporting
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  static fdStream log;                  // error log
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12268
diff changeset
   826
  // disble NMT to avoid further exception
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12268
diff changeset
   827
  MemTracker::shutdown(MemTracker::NMT_error_reporting);
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12268
diff changeset
   828
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  if (SuppressFatalErrorMessage) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
      os::abort();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  jlong mytid = os::current_thread_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  if (first_error == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
      Atomic::cmpxchg_ptr(this, &first_error, NULL) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
    // first time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
    first_error_tid = mytid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
    set_error_reported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   840
    if (ShowMessageBoxOnError || PauseAtExit) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
      show_message_box(buffer, sizeof(buffer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
      // User has asked JVM to abort. Reset ShowMessageBoxOnError so the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
      // WatcherThread can kill JVM if the error handler hangs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
      ShowMessageBoxOnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   848
    // Write a minidump on Windows, check core dump limits on Linux/Solaris
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   849
    os::check_or_create_dump(_siginfo, _context, buffer, sizeof(buffer));
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   850
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    // reset signal handlers or exception filter; make sure recursive crashes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    // are handled properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
    reset_signal_handlers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  } else {
1887
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   856
    // If UseOsErrorReporting we call this for each level of the call stack
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   857
    // while searching for the exception handler.  Only the first level needs
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   858
    // to be reported.
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   859
    if (UseOSErrorReporting && log_done) return;
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   860
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    // This is not the first error, see if it happened in a different thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
    // or in the same thread during error reporting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
    if (first_error_tid != mytid) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
      jio_snprintf(buffer, sizeof(buffer),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
                   "[thread " INT64_FORMAT " also had an error]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
                   mytid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
      out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
      // error reporting is not MT-safe, block current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
      os::infinite_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
      if (recursive_error_count++ > 30) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
        out.print_raw_cr("[Too many errors, abort]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
        os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
      jio_snprintf(buffer, sizeof(buffer),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
                   "[error occurred during error reporting %s, id 0x%x]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
                   first_error ? first_error->_current_step_info : "",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
                   _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
      if (log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
        log.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // print to screen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  if (!out_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    first_error->_verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
    staticBufferStream sbs(buffer, sizeof(buffer), &out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
    out_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  // print to error log file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  if (!log_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
    first_error->_verbose = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
    // see if log file is already open
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
    if (!log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
      // open log file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
      int fd = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
      if (ErrorFile != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
        bool copy_ok =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
          Arguments::copy_expand_pid(ErrorFile, strlen(ErrorFile), buffer, sizeof(buffer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
        if (copy_ok) {
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   920
          fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
      if (fd == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
        const char *cwd = os::get_current_directory(buffer, sizeof(buffer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
        size_t len = strlen(cwd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
        // either user didn't specify, or the user's location failed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
        // so use the default name in the current directory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
        jio_snprintf(&buffer[len], sizeof(buffer)-len, "%shs_err_pid%u.log",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
                     os::file_separator(), os::current_process_id());
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   931
        fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
      if (fd == -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
        const char * tmpdir = os::get_temp_directory();
7901
ea3d83447861 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 7719
diff changeset
   936
        // try temp directory if it exists.
ea3d83447861 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 7719
diff changeset
   937
        if (tmpdir != NULL && tmpdir[0] != '\0') {
ea3d83447861 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 7719
diff changeset
   938
          jio_snprintf(buffer, sizeof(buffer), "%s%shs_err_pid%u.log",
ea3d83447861 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 7719
diff changeset
   939
                       tmpdir, os::file_separator(), os::current_process_id());
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   940
          fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
7901
ea3d83447861 7009828: Fix for 6938627 breaks visualvm monitoring when -Djava.io.tmpdir is defined
coleenp
parents: 7719
diff changeset
   941
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
      if (fd != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
        out.print_raw("# An error report file with more information is saved as:\n# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
        os::set_error_file(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
        log.set_fd(fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
        out.print_raw_cr("# Can not save log file, dump to screen..");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
        log.set_fd(defaultStream::output_fd());
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   953
        /* Error reporting currently needs dumpfile.
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   954
         * Maybe implement direct streaming in the future.*/
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   955
        transmit_report_done = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
    staticBufferStream sbs(buffer, O_BUFLEN, &log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   964
    // Run error reporting to determine whether or not to report the crash.
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   965
    if (!transmit_report_done && should_report_bug(first_error->_id)) {
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   966
      transmit_report_done = true;
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   967
      FILE* hs_err = ::fdopen(log.fd(), "r");
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   968
      if (NULL != hs_err) {
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   969
        ErrorReporter er;
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   970
        er.call(hs_err, buffer, O_BUFLEN);
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   971
      }
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   972
    }
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
   973
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
    if (log.fd() != defaultStream::output_fd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
      close(log.fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
    log.set_fd(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
    log_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  static bool skip_OnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  if (!skip_OnError && OnError && OnError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
    skip_OnError = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
    out.print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
    out.print_raw   ("# -XX:OnError=\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
    out.print_raw   (OnError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
    out.print_raw_cr("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    const char* ptr = OnError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
    while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
      out.print_raw   ("#   Executing ");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
   996
#if defined(LINUX) || defined(_ALLBSD_SOURCE)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
      out.print_raw   ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
      out.print_raw   ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
      out.print_raw   ("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
      out.print_raw   (cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
      out.print_raw_cr("\" ...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
      os::fork_and_exec(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    // done with OnError
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    OnError = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1012
  static bool skip_replay = false;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1013
  if (DumpReplayDataOnError && _thread && _thread->is_Compiler_thread() && !skip_replay) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1014
    skip_replay = true;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1015
    ciEnv* env = ciEnv::current();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1016
    if (env != NULL) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1017
      env->dump_replay_data();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1018
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1019
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1020
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
  1021
  static bool skip_bug_url = !should_report_bug(first_error->_id);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  if (!skip_bug_url) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
    skip_bug_url = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
    out.print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
    print_bug_submit_message(&out, _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  if (!UseOSErrorReporting) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
    // os::abort() will call abort hooks, try it first.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
    static bool skip_os_abort = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
    if (!skip_os_abort) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
      skip_os_abort = true;
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
  1034
      bool dump_core = should_report_bug(first_error->_id);
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
  1035
      os::abort(dump_core);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
    // if os::abort() doesn't abort, try os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
    os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
 * OnOutOfMemoryError scripts/commands executed while VM is a safepoint - this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
 * ensures utilities such as jmap can observe the process is a consistent state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
class VM_ReportJavaOutOfMemory : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  VMError *_err;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  VM_ReportJavaOutOfMemory(VMError *err) { _err = err; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  VMOp_Type type() const                 { return VMOp_ReportJavaOutOfMemory; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
void VM_ReportJavaOutOfMemory::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  tty->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  tty->print_cr("# java.lang.OutOfMemoryError: %s", _err->message());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  tty->print_cr("# -XX:OnOutOfMemoryError=\"%s\"", OnOutOfMemoryError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  // make heap parsability
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  Universe::heap()->ensure_parsability(false);  // no need to retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  const char* ptr = OnOutOfMemoryError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
    tty->print("#   Executing ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
#if defined(LINUX)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    tty->print  ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
    tty->print  ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    tty->print_cr("\"%s\"...", cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
    os::fork_and_exec(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
void VMError::report_java_out_of_memory() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
    VM_ReportJavaOutOfMemory op(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
}