hotspot/src/share/vm/utilities/vmError.cpp
author coleenp
Wed, 22 Jul 2015 00:03:45 -0400
changeset 31963 641ed52732ec
parent 31615 e48d94b97b6c
child 32583 e95e2cfc9cf5
permissions -rw-r--r--
8026324: hs_err improvement: Add summary section to hs_err file 8026333: hs_err improvement: Print GC Strategy 8026336: hs_err improvement: Print compilation mode, server, client or tiered Summary: Added command line, summary cpu and os information to summary section. Moved time of crash and duration in summary section. Add GC strategy and compiler setting (tiered) to enhanced version string in error report. Moved the stack trace sooner in hs_err file. Reviewed-by: dholmes, ctornqvi, ddmitriev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29573
diff changeset
     2
 * Copyright (c) 2003, 2015, 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
28513
9464a1b5c184 8050807: Better performing performance data handling
gthornbr
parents: 27471
diff changeset
    25
#include <fcntl.h>
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    26
#include "precompiled.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 25351
diff changeset
    27
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    28
#include "compiler/compileBroker.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30281
diff changeset
    29
#include "gc/shared/collectedHeap.hpp"
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
    30
#include "prims/whitebox.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    31
#include "runtime/arguments.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 24424
diff changeset
    32
#include "runtime/atomic.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    33
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    34
#include "runtime/init.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    35
#include "runtime/os.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 23204
diff changeset
    36
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    37
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    38
#include "runtime/vm_operations.hpp"
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12268
diff changeset
    39
#include "services/memTracker.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    40
#include "utilities/debug.hpp"
7447
32c42d627f41 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents: 7397
diff changeset
    41
#include "utilities/decoder.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    42
#include "utilities/defaultStream.hpp"
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
    43
#include "utilities/errorReporter.hpp"
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
    44
#include "utilities/events.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    45
#include "utilities/top.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    46
#include "utilities/vmError.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
    48
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
    49
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
// List of environment variables that should be reported in error log file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
const char *env_list[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // All platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  "JAVA_COMPILER", "PATH", "USERNAME",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    56
  // Env variables that are defined on Solaris/Linux/BSD
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  // defined on Linux
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    63
  // defined on Darwin
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    64
  "DYLD_LIBRARY_PATH", "DYLD_FALLBACK_LIBRARY_PATH",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    65
  "DYLD_FRAMEWORK_PATH", "DYLD_FALLBACK_FRAMEWORK_PATH",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    66
  "DYLD_INSERT_LIBRARIES",
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
    67
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  // defined on Windows
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  (const char *)0
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// Fatal error handler for internal errors and crashes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// The default behavior of fatal error handler is to print a brief message
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
// to standard out (defaultStream::output_fd()), then save detailed information
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
// into an error report file (hs_err_pid<pid>.log) and abort VM. If multiple
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
// threads are having troubles at the same time, only one error is reported.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
// The thread that is reporting error will abort VM when it is done, all other
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
// threads are blocked forever inside report_and_die().
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
// Constructor for crashes
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
    84
VMError::VMError(Thread* thread, unsigned int sig, address pc, void* siginfo, void* context) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    _thread = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    _id = sig;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    _pc   = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    _siginfo = siginfo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    _context = context;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
    95
    _message = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
    96
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    _filename = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    _lineno = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
// Constructor for internal errors
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   104
VMError::VMError(Thread* thread, const char* filename, int lineno,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   105
                 const char* message, const char * detail_msg)
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   106
{
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   107
  _thread = thread;
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   108
  _id = INTERNAL_ERROR;     // Value that's not an OS exception/signal
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   109
  _filename = filename;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   110
  _lineno = lineno;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   111
  _message = message;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   112
  _detail_msg = detail_msg;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   113
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   114
  _verbose = false;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   115
  _current_step = 0;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   116
  _current_step_info = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   117
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   118
  _pc = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   119
  _siginfo = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   120
  _context = NULL;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   121
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   122
  _size = 0;
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   123
}
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   124
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   125
// Constructor for OOM errors
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   126
VMError::VMError(Thread* thread, const char* filename, int lineno, size_t size,
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   127
                 VMErrorType vm_err_type, const char* message) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    _thread = thread;
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   129
    _id = vm_err_type; // Value that's not an OS exception/signal
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    _filename = filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    _lineno = lineno;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    _message = message;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   133
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    _pc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    _siginfo = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    _context = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    _size = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
// Constructor for non-fatal errors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
VMError::VMError(const char* message) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    _thread = NULL;
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   150
    _id = INTERNAL_ERROR;     // Value that's not an OS exception/signal
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    _filename = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    _lineno = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    _message = message;
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   154
    _detail_msg = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    _verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    _current_step = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    _current_step_info = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    _pc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    _siginfo = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    _context = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    _size = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
// -XX:OnError=<string>, where <string> can be a list of commands, separated
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
// by ';'. "%p" is replaced by current process id (pid); "%%" is replaced by
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
// a single "%". Some examples:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// -XX:OnError="pmap %p"                // show memory map
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
// -XX:OnError="gcore %p; dbx - %p"     // dump core and launch debugger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
// -XX:OnError="cat hs_err_pid%p.log | mail my_email@sun.com"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
// -XX:OnError="kill -9 %p"             // ?#!@#
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
// A simple parser for -XX:OnError, usage:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
//  ptr = OnError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
//  while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr) != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
//     ... ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
static char* next_OnError_command(char* buf, int buflen, const char** ptr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  if (ptr == NULL || *ptr == NULL) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  const char* cmd = *ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // skip leading blanks or ';'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  while (*cmd == ' ' || *cmd == ';') cmd++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  if (*cmd == '\0') return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  const char * cmdend = cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  while (*cmdend != '\0' && *cmdend != ';') cmdend++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  Arguments::copy_expand_pid(cmd, cmdend - cmd, buf, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  *ptr = (*cmdend == '\0' ? cmdend : cmdend + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
static void print_bug_submit_message(outputStream *out, Thread *thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  if (out == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  out->print_raw_cr("# If you would like to submit a bug report, please visit:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  out->print_raw   ("#   ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  out->print_raw_cr(Arguments::java_vendor_url_bug());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // If the crash is in native code, encourage user to submit a bug to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // provider of that code.
229
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   207
  if (thread && thread->is_Java_thread() &&
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   208
      !thread->is_hidden_from_external_view()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    JavaThread* jt = (JavaThread*)thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    if (jt->thread_state() == _thread_in_native) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
      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
   212
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  out->print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   217
bool VMError::coredump_status;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   218
char VMError::coredump_message[O_BUFLEN];
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   219
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   220
void VMError::record_coredump_status(const char* message, bool status) {
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   221
  coredump_status = status;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   222
  strncpy(coredump_message, message, sizeof(coredump_message));
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   223
  coredump_message[sizeof(coredump_message)-1] = 0;
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   224
}
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   225
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
// Return a string to describe the error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
char* VMError::error_string(char* buf, int buflen) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  char signame_buf[64];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  const char *signame = os::exception_name(_id, signame_buf, sizeof(signame_buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  if (signame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    jio_snprintf(buf, buflen,
30241
4cf8974e0d20 8029630: Thread id should be displayed as a hex number in error report
mockner
parents: 30240
diff changeset
   234
                 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" INTPTR_FORMAT,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
                 signame, _id, _pc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
                 os::current_process_id(), os::current_thread_id());
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   237
  } else if (_filename != NULL && _lineno > 0) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   238
    // skip directory names
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   239
    char separator = os::file_separator()[0];
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   240
    const char *p = strrchr(_filename, separator);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   241
    int n = jio_snprintf(buf, buflen,
30241
4cf8974e0d20 8029630: Thread id should be displayed as a hex number in error report
mockner
parents: 30240
diff changeset
   242
                         "Internal Error at %s:%d, pid=%d, tid=" INTPTR_FORMAT,
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   243
                         p ? p + 1 : _filename, _lineno,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   244
                         os::current_process_id(), os::current_thread_id());
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   245
    if (n >= 0 && n < buflen && _message) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   246
      if (_detail_msg) {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   247
        jio_snprintf(buf + n, buflen - n, "%s%s: %s",
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   248
                     os::line_separator(), _message, _detail_msg);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   249
      } else {
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   250
        jio_snprintf(buf + n, buflen - n, "%sError: %s",
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   251
                     os::line_separator(), _message);
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   252
      }
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   253
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  } else {
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   255
    jio_snprintf(buf, buflen,
30241
4cf8974e0d20 8029630: Thread id should be displayed as a hex number in error report
mockner
parents: 30240
diff changeset
   256
                 "Internal Error (0x%x), pid=%d, tid=" INTPTR_FORMAT,
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   257
                 _id, os::current_process_id(), os::current_thread_id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  return buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   263
void VMError::print_stack_trace(outputStream* st, JavaThread* jt,
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   264
                                char* buf, int buflen, bool verbose) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   265
#ifdef ZERO
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   266
  if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   267
    // StackFrameStream uses the frame anchor, which may not have
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   268
    // been set up.  This can be done at any time in Zero, however,
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   269
    // 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
   270
    // clear it again when we're done.
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   271
    bool has_last_Java_frame = jt->has_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   272
    if (!has_last_Java_frame)
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   273
      jt->set_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   274
    st->print("Java frames:");
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   275
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   276
    // 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
   277
    // set up then it's possible that the information in the frame
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   278
    // is garbage: it could be from a previous decache, or it could
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   279
    // simply have never been written.  So we print a warning...
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   280
    StackFrameStream sfs(jt);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   281
    if (!has_last_Java_frame && !sfs.is_done()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   282
      if (sfs.current()->zeroframe()->is_shark_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   283
        st->print(" (TOP FRAME MAY BE JUNK)");
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   284
      }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   285
    }
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
    // Print the frames
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   289
    for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   290
      sfs.current()->zero_print_on_error(i, st, buf, buflen);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   291
      st->cr();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   292
    }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   293
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   294
    // Reset the frame anchor if necessary
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   295
    if (!has_last_Java_frame)
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   296
      jt->reset_last_Java_frame();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   297
  }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   298
#else
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   299
  if (jt->has_last_Java_frame()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   300
    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
   301
    for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   302
      sfs.current()->print_on_error(st, buf, buflen, verbose);
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   303
      st->cr();
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   304
    }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   305
  }
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   306
#endif // ZERO
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   307
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   309
void VMError::print_oom_reasons(outputStream* st) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   310
  st->print_cr("# Possible reasons:");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   311
  st->print_cr("#   The system is out of physical RAM or swap space");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   312
  st->print_cr("#   In 32 bit mode, the process size limit was hit");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   313
  st->print_cr("# Possible solutions:");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   314
  st->print_cr("#   Reduce memory load on the system");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   315
  st->print_cr("#   Increase physical memory or swap space");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   316
  st->print_cr("#   Check if swap backing store is full");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   317
  st->print_cr("#   Use 64 bit Java on a 64 bit OS");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   318
  st->print_cr("#   Decrease Java heap size (-Xmx/-Xms)");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   319
  st->print_cr("#   Decrease number of Java threads");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   320
  st->print_cr("#   Decrease Java thread stack sizes (-Xss)");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   321
  st->print_cr("#   Set larger code cache with -XX:ReservedCodeCacheSize=");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   322
  st->print_cr("# This output file may be truncated or incomplete.");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   323
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   324
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   325
const char* VMError::gc_mode() {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   326
  if (UseG1GC)            return "g1 gc";
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   327
  if (UseParallelGC)      return "parallel gc";
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   328
  if (UseConcMarkSweepGC) return "concurrent mark sweep gc";
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   329
  if (UseSerialGC)        return "serial gc";
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   330
  return "ERROR in GC mode";
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   331
}
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   332
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
// This is the main function to report a fatal error. Only one thread can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
// call this function, so we don't need to worry about MT-safety. But it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
// possible that the error handler itself may crash or die on an internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
// error, for example, when the stack/heap is badly damaged. We must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
// able to handle recursive errors that happen inside error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
// Error reporting is done in several steps. If a crash or internal error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
// occurred when reporting an error, the nested signal/exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// can skip steps that are already (or partially) done. Error reporting will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
// continue from the next step. This allows us to retrieve and print
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
// information that may be unsafe to get after a fatal error. If it happens,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
// you may find nested report_and_die() frames when you look at the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
// in a debugger.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
// In general, a hang in error handler is much worse than a crash or internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
// error, as it's harder to recover from a hang. Deadlock can happen if we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
// try to grab a lock that is already owned by current thread, or if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
// owner is blocked forever (e.g. in os::infinite_sleep()). If possible, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
// error handler and all the functions it called should avoid grabbing any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
// lock. An important thing to notice is that memory allocation needs a lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
// We should avoid using large stack allocated buffers. Many errors happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
// when stack space is already low. Making things even worse is that there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
// could be nested report_and_die() calls on stack (see above). Only one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
// thread can report error, so large buffers are statically allocated in data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
// segment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
void VMError::report(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
# define BEGIN if (_current_step == 0) { _current_step = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
# define STEP(n, s) } if (_current_step < n) { _current_step = n; _current_step_info = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
# define END }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  // don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  static char buf[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
229
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   370
  STEP(10, "(printing fatal error message)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   372
    st->print_cr("#");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   373
    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
   374
      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
   375
    } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   376
      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
   377
                   "Runtime Environment to continue.");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   378
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   380
#ifndef PRODUCT
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   381
  // Error handler self tests
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   382
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   383
  // test secondary error handling. Test it twice, to test that resetting
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   384
  // error handler after a secondary crash works.
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   385
  STEP(20, "(test secondary crash 1)")
29573
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   386
    if (_verbose && TestCrashInErrorHandler != 0) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   387
      st->print_cr("Will crash now (TestCrashInErrorHandler=%d)...",
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   388
        TestCrashInErrorHandler);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   389
      controlled_crash(TestCrashInErrorHandler);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   390
    }
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   391
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   392
  STEP(30, "(test secondary crash 2)")
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   393
    if (_verbose && TestCrashInErrorHandler != 0) {
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   394
      st->print_cr("Will crash now (TestCrashInErrorHandler=%d)...",
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   395
        TestCrashInErrorHandler);
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   396
      controlled_crash(TestCrashInErrorHandler);
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   397
    }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   398
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   399
  STEP(40, "(test safefetch in error handler)")
29573
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   400
    // test whether it is safe to use SafeFetch32 in Crash Handler. Test twice
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   401
    // to test that resetting the signal handler works correctly.
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   402
    if (_verbose && TestSafeFetchInErrorHandler) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   403
      st->print_cr("Will test SafeFetch...");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   404
      if (CanUseSafeFetch32()) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   405
        int* const invalid_pointer = (int*) get_segfault_address();
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   406
        const int x = 0x76543210;
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   407
        int i1 = SafeFetch32(invalid_pointer, x);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   408
        int i2 = SafeFetch32(invalid_pointer, x);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   409
        if (i1 == x && i2 == x) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   410
          st->print_cr("SafeFetch OK."); // Correctly deflected and returned default pattern
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   411
        } else {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   412
          st->print_cr("??");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   413
        }
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   414
      } else {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   415
        st->print_cr("not possible; skipped.");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   416
      }
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   417
    }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   418
#endif // PRODUCT
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   419
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   420
  STEP(50, "(printing type of error)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
     switch(_id) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   423
       case OOM_MALLOC_ERROR:
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   424
       case OOM_MMAP_ERROR:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
         if (_size) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   426
           st->print("# Native memory allocation ");
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   427
           st->print((_id == (int)OOM_MALLOC_ERROR) ? "(malloc) failed to allocate " :
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   428
                                                 "(mmap) failed to map ");
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   429
           jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size);
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   430
           st->print("%s", buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
           st->print(" bytes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
           if (_message != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
             st->print(" for ");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   434
             st->print("%s", _message);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
           }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   436
           st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
         } else {
31615
e48d94b97b6c 8130036: Fix problems with imprecise C++ coding.
goetz
parents: 31356
diff changeset
   438
           if (_message != NULL) {
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   439
             st->print("# ");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   440
             st->print_cr("%s", _message);
31615
e48d94b97b6c 8130036: Fix problems with imprecise C++ coding.
goetz
parents: 31356
diff changeset
   441
           }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
         }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   443
         // 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
   444
         if (_verbose) {
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   445
           print_oom_reasons(st);
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   446
         } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   447
           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
   448
         }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
         break;
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   450
       case INTERNAL_ERROR:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
       default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   455
  STEP(60, "(printing exception/signal name)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
     st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
     st->print("#  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
     // Is it an OS exception/signal?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
     if (os::exception_name(_id, buf, sizeof(buf))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
       st->print("%s", buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
       st->print(" (0x%x)", _id);                // signal number
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
       st->print(" at pc=" PTR_FORMAT, _pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
     } else {
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   465
       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
   466
         st->print("Internal Error");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   467
       } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   468
         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
   469
       }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
       if (_filename != NULL && _lineno > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
#ifdef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
         // In product mode chop off pathname?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
         char separator = os::file_separator()[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
         const char *p = strrchr(_filename, separator);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
         const char *file = p ? p+1 : _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
         const char *file = _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
#endif
30281
b1608535e50f 8076475: Misuses of strncpy/strncat
stuefe
parents: 30241
diff changeset
   479
         st->print(" (%s:%d)", file, _lineno);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
         st->print(" (0x%x)", _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   485
  STEP(70, "(printing current thread and pid)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
     // process id, thread id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
     st->print(", pid=%d", os::current_process_id());
30241
4cf8974e0d20 8029630: Thread id should be displayed as a hex number in error report
mockner
parents: 30240
diff changeset
   489
     st->print(", tid=" INTPTR_FORMAT, os::current_thread_id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
     st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   492
  STEP(80, "(printing error message)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   494
     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
   495
       // error message
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   496
       if (_detail_msg) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   497
         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
   498
       } else if (_message) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   499
         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
   500
       }
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   501
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   503
  STEP(90, "(printing Java version string)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
     // VM version
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
     st->print_cr("#");
1660
86be56b9ba46 6689685: Hotspot crash error message should include libraries version
coleenp
parents: 1500
diff changeset
   507
     JDK_Version::current().to_string(buf, sizeof(buf));
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   508
     const char* runtime_name = JDK_Version::runtime_name() != NULL ?
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   509
                                  JDK_Version::runtime_name() : "";
14289
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   510
     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
   511
                                  JDK_Version::runtime_version() : "";
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   512
     st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version);
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   513
     // This is the long version with some default settings added
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   514
     st->print_cr("# Java VM: %s (%s, %s%s%s, %s, %s)",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
                   Abstract_VM_Version::vm_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
                   Abstract_VM_Version::vm_release(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
                   Abstract_VM_Version::vm_info_string(),
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   518
                   TieredCompilation ? ", tiered" : "",
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   519
                   UseCompressedOops ? ", compressed oops" : "",
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   520
                   gc_mode(),
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   521
                   Abstract_VM_Version::vm_platform_string()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
                 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   524
  STEP(100, "(printing problematic frame)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
     // Print current frame if we have a context (i.e. it's a crash)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
     if (_context) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
       st->print_cr("# Problematic frame:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
       st->print("# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
       frame fr = os::fetch_frame_from_context(_context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
       fr.print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
       st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
     }
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   535
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   536
  STEP(110, "(printing core file information)")
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   537
    st->print("# ");
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   538
    if (CreateCoredumpOnCrash) {
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   539
      if (coredump_status) {
30622
648d51c142bd 8078121: Add 'CreateMinidumpOnCrash' (JDK-8074354) caused many tests failed in nightly testing
ctornqvi
parents: 30281
diff changeset
   540
        st->print("Core dump will be written. Default location: %s", coredump_message);
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   541
      } else {
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   542
        st->print("No core dump will be written. %s", coredump_message);
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   543
      }
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   544
    } else {
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   545
      st->print("CreateCoredumpOnCrash turned off, no core file dumped");
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   546
    }
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   547
    st->cr();
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   548
    st->print_cr("#");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   550
  STEP(120, "(printing bug submit message)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   552
     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
   553
       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
   554
     }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   556
  STEP(130, "(printing summary)" )
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   557
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   558
     if (_verbose) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   559
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   560
       st->print_cr("---------------  S U M M A R Y ------------");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   561
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   562
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   563
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   564
  STEP(140, "(printing VM option summary)" )
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   565
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   566
     if (_verbose) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   567
       // VM options
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   568
       Arguments::print_summary_on(st);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   569
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   570
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   571
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   572
  STEP(150, "(printing summary machine and OS info)")
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   573
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   574
     if (_verbose) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   575
       os::print_summary_info(st, buf, sizeof(buf));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   576
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   577
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   578
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   579
  STEP(160, "(printing date and time)" )
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   580
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   581
     if (_verbose) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   582
       os::print_date_and_time(st, buf, sizeof(buf));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   583
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   584
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   585
  STEP(170, "(printing thread)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
       st->print_cr("---------------  T H R E A D  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   593
  STEP(180, "(printing current thread)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
     // current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
         st->print("Current thread (" PTR_FORMAT "):  ", _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
         _thread->print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
         st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
         st->print_cr("Current thread is native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   607
  STEP(190, "(printing current compile task)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   609
     if (_verbose && _thread && _thread->is_Compiler_thread()) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   610
        CompilerThread* t = (CompilerThread*)_thread;
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   611
        if (t->task()) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   612
           st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   613
           st->print_cr("Current CompileTask:");
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   614
           t->task()->print_line_on_error(st, buf, sizeof(buf));
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   615
           st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   616
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   620
  STEP(200, "(printing stack bounds)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
       st->print("Stack: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
       address stack_top;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
       size_t stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
          stack_top = _thread->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
          stack_size = _thread->stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
          stack_top = os::current_stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
          stack_size = os::current_stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
       address stack_bottom = stack_top - stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
       st->print("[" PTR_FORMAT "," PTR_FORMAT "]", stack_bottom, stack_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
       if (fr.sp()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
         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
   644
         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
   645
         st->print(",  free space=" SIZE_FORMAT "k", free_stack_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   651
  STEP(210, "(printing native stack)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
26821
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25946
diff changeset
   653
   if (_verbose) {
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   654
     if (os::platform_print_native_stack(st, _context, buf, sizeof(buf))) {
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   655
       // We have printed the native stack in platform-specific code
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   656
       // Windows/x64 needs special handling.
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   657
     } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
26821
ce9f82507dc2 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
simonis
parents: 25946
diff changeset
   661
       print_native_stack(st, fr, _thread, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
     }
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   663
   }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   665
  STEP(220, "(printing Java stack)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
     if (_verbose && _thread && _thread->is_Java_thread()) {
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   668
       print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   671
  STEP(230, "(printing target Java thread stack)" )
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   672
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   673
     // 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
   674
     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
   675
       JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   676
       if (jt != NULL) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   677
         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
   678
         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
   679
       }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   680
     }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   681
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   682
  STEP(240, "(printing siginfo)" )
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   683
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   684
     // signal no, signal code, address that caused the fault
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   685
     if (_verbose && _siginfo) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   686
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   687
       os::print_siginfo(st, _siginfo);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   688
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   689
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   690
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   691
  STEP(250, "(printing register info)")
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   692
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   693
     // decode register contents if possible
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   694
     if (_verbose && _context && Universe::is_fully_initialized()) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   695
       os::print_register_info(st, _context);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   696
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   697
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   698
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   699
  STEP(260, "(printing registers, top of stack, instructions near pc)")
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   700
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   701
     // registers, top of stack, instructions near pc
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   702
     if (_verbose && _context) {
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   703
       os::print_context(st, _context);
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   704
       st->cr();
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   705
     }
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   706
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   707
  STEP(270, "(printing VM operation)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
     if (_verbose && _thread && _thread->is_VM_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
        VMThread* t = (VMThread*)_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
        VM_Operation* op = t->vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
        if (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
          op->print_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   719
  STEP(280, "(printing process)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
       st->print_cr("---------------  P R O C E S S  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   727
  STEP(290, "(printing all threads)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
     // all threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
     if (_verbose && _thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
       Threads::print_on_error(st, _thread, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   735
  STEP(300, "(printing VM state)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
       // Safepoint state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
       st->print("VM state:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
       if (SafepointSynchronize::is_synchronizing()) st->print("synchronizing");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
       else if (SafepointSynchronize::is_at_safepoint()) st->print("at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
       else st->print("not at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
       // Also see if error occurred during initialization or shutdown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
       if (!Universe::is_fully_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
         st->print(" (not fully initialized)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
       } else if (VM_Exit::vm_exited()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
         st->print(" (shutting down)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
         st->print(" (normal execution)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   757
  STEP(310, "(printing owned locks on error)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
     // mutexes/monitors that currently have an owner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
       print_owned_locks_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   765
  STEP(320, "(printing number of OutOfMemoryError and StackOverflow exceptions)")
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   766
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   767
     if (_verbose && Exceptions::has_exception_counts()) {
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   768
       st->print_cr("OutOfMemory and StackOverflow Exception counts:");
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   769
       Exceptions::print_exception_counts_on_error(st);
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   770
       st->cr();
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   771
     }
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   772
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   773
  STEP(330, "(printing compressed oops mode")
31335
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   774
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   775
     if (_verbose && UseCompressedOops) {
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   776
       Universe::print_compressed_oops_mode(st);
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   777
       if (UseCompressedClassPointers) {
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   778
         Metaspace::print_compressed_class_space(st);
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   779
       }
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   780
       st->cr();
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   781
     }
60081f497e75 8035074: hs_err improvement: Add time zone information in the hs_err file
coleenp
parents: 30773
diff changeset
   782
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   783
  STEP(340, "(printing heap information)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
     if (_verbose && Universe::is_fully_initialized()) {
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15602
diff changeset
   786
       Universe::heap()->print_on_error(st);
12268
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   787
       st->cr();
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   788
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   789
       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
   790
       st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   793
  STEP(350, "(printing code cache information)" )
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   794
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   795
     if (_verbose && Universe::is_fully_initialized()) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   796
       // print code cache information before vm abort
15201
f3d755b11424 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 14477
diff changeset
   797
       CodeCache::print_summary(st);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   798
       st->cr();
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   799
     }
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   800
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   801
  STEP(360, "(printing ring buffers)" )
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   802
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   803
     if (_verbose) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   804
       Events::print_all(st);
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   805
       st->cr();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   806
     }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   807
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   808
  STEP(370, "(printing dynamic libraries)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
       // dynamic libraries, or memory map
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
       os::print_dll_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   816
  STEP(380, "(printing VM options)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
       // VM options
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
       Arguments::print_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   824
  STEP(390, "(printing warning if internal testing API used)" )
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   825
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   826
     if (WhiteBox::used()) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   827
       st->print_cr("Unsupported internal testing APIs have been used.");
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   828
       st->cr();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   829
     }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   830
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   831
  STEP(400, "(printing all environment variables)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
     if (_verbose) {
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29573
diff changeset
   834
       os::print_environment_variables(st, env_list);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   838
  STEP(410, "(printing signal handlers)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
       os::print_signal_handlers(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   845
  STEP(420, "(Native Memory Tracking)" )
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   846
     if (_verbose) {
27162
0a4a7276949b 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 26821
diff changeset
   847
       MemTracker::error_report(st);
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   848
     }
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   849
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   850
  STEP(430, "(printing system)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
       st->print_cr("---------------  S Y S T E M  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   858
  STEP(440, "(printing OS information)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
       os::print_os_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   865
  STEP(450, "(printing CPU info)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
     if (_verbose) {
31356
55ee785c49c5 8085865: hs_err improvement: Printing /proc/cpuinfo makes too long hs_err files
coleenp
parents: 31335
diff changeset
   867
       os::print_cpu_info(st, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   871
  STEP(460, "(printing memory info)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
       os::print_memory_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   878
  STEP(470, "(printing internal vm info)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
       st->print_cr("vm_info: %s", Abstract_VM_Version::internal_vm_info_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   885
  // print a defined marker to show that error handling finished correctly.
31963
641ed52732ec 8026324: hs_err improvement: Add summary section to hs_err file
coleenp
parents: 31615
diff changeset
   886
  STEP(480, "(printing end marker)" )
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   887
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   888
     if (_verbose) {
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   889
       st->print_cr("END.");
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   890
     }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   891
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
# undef BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
# undef STEP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
# undef END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   899
VMError* volatile VMError::first_error = NULL;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   900
volatile jlong VMError::first_error_tid = -1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
18487
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   902
// An error could happen before tty is initialized or after it has been
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   903
// destroyed. Here we use a very simple unbuffered fdStream for printing.
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   904
// Only out.print_raw() and out.print_raw_cr() should be used, as other
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   905
// printing methods need to allocate large buffer on stack. To format a
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   906
// string, use jio_snprintf() with a static buffer or use staticBufferStream.
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   907
fdStream VMError::out(defaultStream::output_fd());
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   908
fdStream VMError::log; // error log used by VMError::report_and_die()
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   909
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   910
/** Expand a pattern into a buffer starting at pos and open a file using constructed path */
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   911
static int expand_and_open(const char* pattern, char* buf, size_t buflen, size_t pos) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   912
  int fd = -1;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   913
  if (Arguments::copy_expand_pid(pattern, strlen(pattern), &buf[pos], buflen - pos)) {
28513
9464a1b5c184 8050807: Better performing performance data handling
gthornbr
parents: 27471
diff changeset
   914
    // the O_EXCL flag will cause the open to fail if the file exists
9464a1b5c184 8050807: Better performing performance data handling
gthornbr
parents: 27471
diff changeset
   915
    fd = open(buf, O_RDWR | O_CREAT | O_EXCL, 0666);
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   916
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   917
  return fd;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   918
}
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   919
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   920
/**
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   921
 * Construct file name for a log file and return it's file descriptor.
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   922
 * Name and location depends on pattern, default_pattern params and access
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   923
 * permissions.
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   924
 */
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   925
static int prepare_log_file(const char* pattern, const char* default_pattern, char* buf, size_t buflen) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   926
  int fd = -1;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   927
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   928
  // If possible, use specified pattern to construct log file name
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   929
  if (pattern != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   930
    fd = expand_and_open(pattern, buf, buflen, 0);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   931
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   932
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   933
  // Either user didn't specify, or the user's location failed,
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   934
  // so use the default name in the current directory
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   935
  if (fd == -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   936
    const char* cwd = os::get_current_directory(buf, buflen);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   937
    if (cwd != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   938
      size_t pos = strlen(cwd);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   939
      int fsep_len = jio_snprintf(&buf[pos], buflen-pos, "%s", os::file_separator());
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   940
      pos += fsep_len;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   941
      if (fsep_len > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   942
        fd = expand_and_open(default_pattern, buf, buflen, pos);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   943
      }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   944
    }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   945
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   946
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   947
   // try temp directory if it exists.
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   948
   if (fd == -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   949
     const char* tmpdir = os::get_temp_directory();
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   950
     if (tmpdir != NULL && strlen(tmpdir) > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   951
       int pos = jio_snprintf(buf, buflen, "%s%s", tmpdir, os::file_separator());
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   952
       if (pos > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   953
         fd = expand_and_open(default_pattern, buf, buflen, pos);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   954
       }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   955
     }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   956
   }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   957
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   958
  return fd;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   959
}
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   960
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
void VMError::report_and_die() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  // How many errors occurred in error handler when reporting first_error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  static int recursive_error_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  // We will first print a brief message to standard out (verbose = false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  // then save detailed information in log file (verbose = true).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  static bool out_done = false;         // done printing to standard out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  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
   972
  static bool transmit_report_done = false; // done error reporting
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  if (SuppressFatalErrorMessage) {
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   975
      os::abort(CreateCoredumpOnCrash);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  jlong mytid = os::current_thread_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
  if (first_error == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
      Atomic::cmpxchg_ptr(this, &first_error, NULL) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
    // first time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
    first_error_tid = mytid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
    set_error_reported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   985
    if (ShowMessageBoxOnError || PauseAtExit) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
      show_message_box(buffer, sizeof(buffer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
      // User has asked JVM to abort. Reset ShowMessageBoxOnError so the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
      // WatcherThread can kill JVM if the error handler hangs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
      ShowMessageBoxOnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   993
    os::check_dump_limit(buffer, sizeof(buffer));
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   994
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
    // reset signal handlers or exception filter; make sure recursive crashes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    // are handled properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    reset_signal_handlers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  } else {
1887
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
  1000
    // 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
  1001
    // 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
  1002
    // to be reported.
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
  1003
    if (UseOSErrorReporting && log_done) return;
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
  1004
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
    // This is not the first error, see if it happened in a different thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    // or in the same thread during error reporting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    if (first_error_tid != mytid) {
18684
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
  1008
      char msgbuf[64];
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
  1009
      jio_snprintf(msgbuf, sizeof(msgbuf),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
                   "[thread " INT64_FORMAT " also had an error]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
                   mytid);
18684
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
  1012
      out.print_raw_cr(msgbuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
      // error reporting is not MT-safe, block current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
      os::infinite_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
      if (recursive_error_count++ > 30) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
        out.print_raw_cr("[Too many errors, abort]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
        os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
      jio_snprintf(buffer, sizeof(buffer),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
                   "[error occurred during error reporting %s, id 0x%x]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
                   first_error ? first_error->_current_step_info : "",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
                   _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
      if (log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
        log.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  // print to screen
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  if (!out_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    first_error->_verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
    staticBufferStream sbs(buffer, sizeof(buffer), &out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
    out_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  // print to error log file
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  if (!log_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    first_error->_verbose = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    // see if log file is already open
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
    if (!log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
      // open log file
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1059
      int fd = prepare_log_file(ErrorFile, "hs_err_pid%p.log", buffer, sizeof(buffer));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
      if (fd != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
        out.print_raw("# An error report file with more information is saved as:\n# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
        log.set_fd(fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
        out.print_raw_cr("# Can not save log file, dump to screen..");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
        log.set_fd(defaultStream::output_fd());
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1068
        /* Error reporting currently needs dumpfile.
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1069
         * Maybe implement direct streaming in the future.*/
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1070
        transmit_report_done = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
    staticBufferStream sbs(buffer, O_BUFLEN, &log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1079
    // 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
  1080
    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
  1081
      transmit_report_done = true;
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1082
      const int fd2 = ::dup(log.fd());
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1083
      FILE* const hs_err = ::fdopen(fd2, "r");
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1084
      if (NULL != hs_err) {
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1085
        ErrorReporter er;
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1086
        er.call(hs_err, buffer, O_BUFLEN);
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1087
      }
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1088
      ::fclose(hs_err);
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1089
    }
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1090
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
    if (log.fd() != defaultStream::output_fd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
      close(log.fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    log.set_fd(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
    log_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
  static bool skip_OnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  if (!skip_OnError && OnError && OnError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    skip_OnError = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
    out.print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
    out.print_raw   ("# -XX:OnError=\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
    out.print_raw   (OnError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
    out.print_raw_cr("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
    char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    const char* ptr = OnError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
      out.print_raw   ("#   Executing ");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
  1113
#if defined(LINUX) || defined(_ALLBSD_SOURCE)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
      out.print_raw   ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
      out.print_raw   ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
      out.print_raw   ("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
      out.print_raw   (cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
      out.print_raw_cr("\" ...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
30745
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1122
      if (os::fork_and_exec(cmd) < 0) {
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1123
        out.print_cr("os::fork_and_exec failed: %s (%d)", strerror(errno), errno);
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1124
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    // done with OnError
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
    OnError = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
22243
91944eab7b92 8028468: Add inlining information into ciReplay
kvn
parents: 20692
diff changeset
  1131
  static bool skip_replay = ReplayCompiles; // Do not overwrite file during replay
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1132
  if (DumpReplayDataOnError && _thread && _thread->is_Compiler_thread() && !skip_replay) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1133
    skip_replay = true;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1134
    ciEnv* env = ciEnv::current();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1135
    if (env != NULL) {
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1136
      int fd = prepare_log_file(ReplayDataFile, "replay_pid%p.log", buffer, sizeof(buffer));
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1137
      if (fd != -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1138
        FILE* replay_data_file = os::open(fd, "w");
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1139
        if (replay_data_file != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1140
          fileStream replay_data_stream(replay_data_file, /*need_close=*/true);
20692
65021f70c2fc 8024943: ciReplay: fails to dump replay data during safepointing
vlivanov
parents: 19952
diff changeset
  1141
          env->dump_replay_data_unsafe(&replay_data_stream);
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1142
          out.print_raw("#\n# Compiler replay data is saved as:\n# ");
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1143
          out.print_raw_cr(buffer);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1144
        } else {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1145
          out.print_raw("#\n# Can't open file to dump replay data. Error: ");
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1146
          out.print_raw_cr(strerror(os::get_last_error()));
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1147
        }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1148
      }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1149
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1150
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1151
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
  1152
  static bool skip_bug_url = !should_report_bug(first_error->_id);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  if (!skip_bug_url) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
    skip_bug_url = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
    out.print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
    print_bug_submit_message(&out, _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  if (!UseOSErrorReporting) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
    // os::abort() will call abort hooks, try it first.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
    static bool skip_os_abort = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
    if (!skip_os_abort) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
      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
  1165
      bool dump_core = should_report_bug(first_error->_id);
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
  1166
      os::abort(dump_core && CreateCoredumpOnCrash, _siginfo, _context);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    // if os::abort() doesn't abort, try os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
 * OnOutOfMemoryError scripts/commands executed while VM is a safepoint - this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
 * ensures utilities such as jmap can observe the process is a consistent state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
class VM_ReportJavaOutOfMemory : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  VMError *_err;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  VM_ReportJavaOutOfMemory(VMError *err) { _err = err; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  VMOp_Type type() const                 { return VMOp_ReportJavaOutOfMemory; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
void VM_ReportJavaOutOfMemory::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  tty->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  tty->print_cr("# java.lang.OutOfMemoryError: %s", _err->message());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  tty->print_cr("# -XX:OnOutOfMemoryError=\"%s\"", OnOutOfMemoryError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  // make heap parsability
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  Universe::heap()->ensure_parsability(false);  // no need to retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  const char* ptr = OnOutOfMemoryError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
    tty->print("#   Executing ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
#if defined(LINUX)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
    tty->print  ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
    tty->print  ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
    tty->print_cr("\"%s\"...", cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
30745
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1209
    if (os::fork_and_exec(cmd) < 0) {
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1210
      tty->print_cr("os::fork_and_exec failed: %s (%d)", strerror(errno), errno);
8ebe80838174 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()
dholmes
parents: 30622
diff changeset
  1211
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
void VMError::report_java_out_of_memory() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
    VM_ReportJavaOutOfMemory op(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
}