hotspot/src/share/vm/utilities/vmError.cpp
author minqi
Wed, 15 Apr 2015 17:34:28 -0700
changeset 30240 a7ba42fa1df6
parent 30125 8ba6e8e367e9
child 30241 4cf8974e0d20
permissions -rw-r--r--
8074354: Make CreateMinidumpOnCrash a new name and available on all platforms Summary: Rename CreateMinidumpOnCrash which is used only for Windows as CreateCoredumpOnCrash and make it available for all platforms. Changed order for dumping core on Windows to be similar on other platforms. Also reviewed by thomas.stuefe@gmail.com Reviewed-by: dcubed Contributed-by: yumin.qi@oracle.com, thomas.stuefe@gmail.com
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7108
diff changeset
    29
#include "gc_interface/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,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
                 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" UINTX_FORMAT,
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,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   242
                         "Internal Error at %s:%d, pid=%d, tid=" UINTX_FORMAT,
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,
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 5340
diff changeset
   256
                 "Internal Error (0x%x), pid=%d, tid=" UINTX_FORMAT,
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
// This is the main function to report a fatal error. Only one thread can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
// call this function, so we don't need to worry about MT-safety. But it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// possible that the error handler itself may crash or die on an internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// error, for example, when the stack/heap is badly damaged. We must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// able to handle recursive errors that happen inside error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
// Error reporting is done in several steps. If a crash or internal error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
// occurred when reporting an error, the nested signal/exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
// can skip steps that are already (or partially) done. Error reporting will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
// continue from the next step. This allows us to retrieve and print
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
// information that may be unsafe to get after a fatal error. If it happens,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
// you may find nested report_and_die() frames when you look at the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
// in a debugger.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
// In general, a hang in error handler is much worse than a crash or internal
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
// error, as it's harder to recover from a hang. Deadlock can happen if we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
// try to grab a lock that is already owned by current thread, or if the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
// owner is blocked forever (e.g. in os::infinite_sleep()). If possible, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
// error handler and all the functions it called should avoid grabbing any
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
// lock. An important thing to notice is that memory allocation needs a lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
// We should avoid using large stack allocated buffers. Many errors happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
// when stack space is already low. Making things even worse is that there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
// could be nested report_and_die() calls on stack (see above). Only one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
// thread can report error, so large buffers are statically allocated in data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
// segment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
void VMError::report(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
# define BEGIN if (_current_step == 0) { _current_step = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
# define STEP(n, s) } if (_current_step < n) { _current_step = n; _current_step_info = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
# define END }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  static char buf[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
229
4fddba548751 6549844: Wording problems in "An unexpected error ..."
coleenp
parents: 1
diff changeset
   346
  STEP(10, "(printing fatal error message)")
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   348
    st->print_cr("#");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   349
    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
   350
      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
   351
    } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   352
      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
   353
                   "Runtime Environment to continue.");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   354
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   356
#ifndef PRODUCT
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   357
  // Error handler self tests
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   358
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   359
  // 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
   360
  // error handler after a secondary crash works.
29573
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   361
  STEP(11, "(test secondary crash 1)")
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   362
    if (_verbose && TestCrashInErrorHandler != 0) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   363
      st->print_cr("Will crash now (TestCrashInErrorHandler=%d)...",
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   364
        TestCrashInErrorHandler);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   365
      controlled_crash(TestCrashInErrorHandler);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   366
    }
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   367
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   368
  STEP(12, "(test secondary crash 2)")
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   369
    if (_verbose && TestCrashInErrorHandler != 0) {
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   370
      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
   371
        TestCrashInErrorHandler);
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   372
      controlled_crash(TestCrashInErrorHandler);
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   373
    }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   374
29573
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   375
  STEP(13, "(test safefetch in error handler)")
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   376
    // 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
   377
    // 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
   378
    if (_verbose && TestSafeFetchInErrorHandler) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   379
      st->print_cr("Will test SafeFetch...");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   380
      if (CanUseSafeFetch32()) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   381
        int* const invalid_pointer = (int*) get_segfault_address();
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   382
        const int x = 0x76543210;
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   383
        int i1 = SafeFetch32(invalid_pointer, x);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   384
        int i2 = SafeFetch32(invalid_pointer, x);
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   385
        if (i1 == x && i2 == x) {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   386
          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
   387
        } else {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   388
          st->print_cr("??");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   389
        }
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   390
      } else {
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   391
        st->print_cr("not possible; skipped.");
2d800e5d575f 8074552: SafeFetch32 and SafeFetchN do not work in error handling
dholmes
parents: 28943
diff changeset
   392
      }
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   393
    }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   394
#endif // PRODUCT
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   395
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  STEP(15, "(printing type of error)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
     switch(_id) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   399
       case OOM_MALLOC_ERROR:
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   400
       case OOM_MMAP_ERROR:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
         if (_size) {
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   402
           st->print("# Native memory allocation ");
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   403
           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
   404
                                                 "(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
   405
           jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size);
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   406
           st->print("%s", buf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
           st->print(" bytes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
           if (_message != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
             st->print(" for ");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   410
             st->print("%s", _message);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
           }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   412
           st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
         } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
           if (_message != NULL)
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   415
             st->print("# ");
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   416
             st->print_cr("%s", _message);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
         }
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   418
         // 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
   419
         if (_verbose) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   420
           st->print_cr("# Possible reasons:");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   421
           st->print_cr("#   The system is out of physical RAM or swap space");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   422
           st->print_cr("#   In 32 bit mode, the process size limit was hit");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   423
           st->print_cr("# Possible solutions:");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   424
           st->print_cr("#   Reduce memory load on the system");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   425
           st->print_cr("#   Increase physical memory or swap space");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   426
           st->print_cr("#   Check if swap backing store is full");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   427
           st->print_cr("#   Use 64 bit Java on a 64 bit OS");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   428
           st->print_cr("#   Decrease Java heap size (-Xmx/-Xms)");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   429
           st->print_cr("#   Decrease number of Java threads");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   430
           st->print_cr("#   Decrease Java thread stack sizes (-Xss)");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   431
           st->print_cr("#   Set larger code cache with -XX:ReservedCodeCacheSize=");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   432
           st->print_cr("# This output file may be truncated or incomplete.");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   433
         } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   434
           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
   435
         }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
         break;
17087
f0b76c4c93a0 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 16685
diff changeset
   437
       case INTERNAL_ERROR:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
       default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  STEP(20, "(printing exception/signal name)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
     st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
     st->print("#  ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
     // Is it an OS exception/signal?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
     if (os::exception_name(_id, buf, sizeof(buf))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
       st->print("%s", buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
       st->print(" (0x%x)", _id);                // signal number
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
       st->print(" at pc=" PTR_FORMAT, _pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
     } else {
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   452
       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
   453
         st->print("Internal Error");
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   454
       } else {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   455
         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
   456
       }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
       if (_filename != NULL && _lineno > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
#ifdef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
         // In product mode chop off pathname?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
         char separator = os::file_separator()[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
         const char *p = strrchr(_filename, separator);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
         const char *file = p ? p+1 : _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
         const char *file = _filename;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
         size_t len = strlen(file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
         size_t buflen = sizeof(buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
         strncpy(buf, file, buflen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
         if (len + 10 < buflen) {
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1887
diff changeset
   471
           sprintf(buf + len, ":%d", _lineno);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
         st->print(" (%s)", buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
         st->print(" (0x%x)", _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  STEP(30, "(printing current thread and pid)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
     // process id, thread id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
     st->print(", pid=%d", os::current_process_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
     st->print(", tid=" UINTX_FORMAT, os::current_thread_id());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
     st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  STEP(40, "(printing error message)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   488
     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
   489
       // error message
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   490
       if (_detail_msg) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   491
         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
   492
       } else if (_message) {
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   493
         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
   494
       }
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   495
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  STEP(50, "(printing Java version string)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
     // VM version
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
     st->print_cr("#");
1660
86be56b9ba46 6689685: Hotspot crash error message should include libraries version
coleenp
parents: 1500
diff changeset
   501
     JDK_Version::current().to_string(buf, sizeof(buf));
13106
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   502
     const char* runtime_name = JDK_Version::runtime_name() != NULL ?
cecfb99d6cff 7176856: add the JRE name to the error log
twisti
parents: 12268
diff changeset
   503
                                  JDK_Version::runtime_name() : "";
14289
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   504
     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
   505
                                  JDK_Version::runtime_version() : "";
aec758622b4b 8002078: hs_err_pid file should report full JDK version string
sla
parents: 13196
diff changeset
   506
     st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   507
     st->print_cr("# Java VM: %s (%s %s %s %s)",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
                   Abstract_VM_Version::vm_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
                   Abstract_VM_Version::vm_release(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
                   Abstract_VM_Version::vm_info_string(),
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   511
                   Abstract_VM_Version::vm_platform_string(),
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 229
diff changeset
   512
                   UseCompressedOops ? "compressed oops" : ""
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
                 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  STEP(60, "(printing problematic frame)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
     // Print current frame if we have a context (i.e. it's a crash)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
     if (_context) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
       st->print_cr("# Problematic frame:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
       st->print("# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
       frame fr = os::fetch_frame_from_context(_context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
       fr.print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
       st->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
     }
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   526
  STEP(63, "(printing core file information)")
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   527
    st->print("# ");
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   528
    if (CreateCoredumpOnCrash) {
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   529
      if (coredump_status) {
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   530
        st->print("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
   531
      } else {
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   532
        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
   533
      }
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   534
    } else {
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   535
      st->print("CreateCoredumpOnCrash turned off, no core file dumped");
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   536
    }
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 24351
diff changeset
   537
    st->cr();
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   538
    st->print_cr("#");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  STEP(65, "(printing bug submit message)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
   542
     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
   543
       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
   544
     }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  STEP(70, "(printing thread)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
       st->print_cr("---------------  T H R E A D  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  STEP(80, "(printing current thread)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
     // current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
         st->print("Current thread (" PTR_FORMAT "):  ", _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
         _thread->print_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
         st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
         st->print_cr("Current thread is native thread");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  STEP(90, "(printing siginfo)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
     // signal no, signal code, address that caused the fault
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
     if (_verbose && _siginfo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
       os::print_siginfo(st, _siginfo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  STEP(100, "(printing registers, top of stack, instructions near pc)")
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
     // registers, top of stack, instructions near pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
     if (_verbose && _context) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
       os::print_context(st, _context);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   584
  STEP(105, "(printing register info)")
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   585
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   586
     // decode register contents if possible
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   587
     if (_verbose && _context && Universe::is_fully_initialized()) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   588
       os::print_register_info(st, _context);
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   589
       st->cr();
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   590
     }
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   591
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  STEP(110, "(printing stack bounds)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
       st->print("Stack: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
       address stack_top;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
       size_t stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
       if (_thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
          stack_top = _thread->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
          stack_size = _thread->stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
          stack_top = os::current_stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
          stack_size = os::current_stack_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
       address stack_bottom = stack_top - stack_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
       st->print("[" PTR_FORMAT "," PTR_FORMAT "]", stack_bottom, stack_top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
       if (fr.sp()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
         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
   616
         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
   617
         st->print(",  free space=" SIZE_FORMAT "k", free_stack_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  STEP(120, "(printing native stack)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
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
   625
   if (_verbose) {
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   626
     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
   627
       // 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
   628
       // 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
   629
     } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
       frame fr = _context ? os::fetch_frame_from_context(_context)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
                           : os::current_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
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
   633
       print_native_stack(st, fr, _thread, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
     }
19952
bc974e92f881 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 19334
diff changeset
   635
   }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  STEP(130, "(printing Java stack)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
     if (_verbose && _thread && _thread->is_Java_thread()) {
5340
b838d4165c92 6944503: Improved Zero crash dump
twisti
parents: 5237
diff changeset
   640
       print_stack_trace(st, (JavaThread*)_thread, buf, sizeof(buf));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   643
  STEP(135, "(printing target Java thread stack)" )
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   644
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   645
     // 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
   646
     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
   647
       JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   648
       if (jt != NULL) {
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   649
         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
   650
         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
   651
       }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   652
     }
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 4013
diff changeset
   653
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  STEP(140, "(printing VM operation)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
     if (_verbose && _thread && _thread->is_VM_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
        VMThread* t = (VMThread*)_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
        VM_Operation* op = t->vm_operation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
        if (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
          op->print_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
          st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  STEP(150, "(printing current compile task)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
     if (_verbose && _thread && _thread->is_Compiler_thread()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
        CompilerThread* t = (CompilerThread*)_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
        if (t->task()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
           st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
           st->print_cr("Current CompileTask:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
           t->task()->print_line_on_error(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
           st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  STEP(160, "(printing process)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
       st->print_cr("---------------  P R O C E S S  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  STEP(170, "(printing all threads)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
     // all threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
     if (_verbose && _thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
       Threads::print_on_error(st, _thread, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  STEP(175, "(printing VM state)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
       // Safepoint state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
       st->print("VM state:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
       if (SafepointSynchronize::is_synchronizing()) st->print("synchronizing");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
       else if (SafepointSynchronize::is_at_safepoint()) st->print("at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
       else st->print("not at safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
       // Also see if error occurred during initialization or shutdown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
       if (!Universe::is_fully_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
         st->print(" (not fully initialized)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
       } else if (VM_Exit::vm_exited()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
         st->print(" (shutting down)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
       } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
         st->print(" (normal execution)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
       }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  STEP(180, "(printing owned locks on error)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
     // mutexes/monitors that currently have an owner
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
       print_owned_locks_on_error(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  STEP(190, "(printing heap information)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
     if (_verbose && Universe::is_fully_initialized()) {
16685
41c34debcde0 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 15602
diff changeset
   727
       Universe::heap()->print_on_error(st);
12268
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   728
       st->cr();
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   729
f7897aacb9ce 7157141: crash in 64 bit with corrupted oops
never
parents: 12095
diff changeset
   730
       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
   731
       st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   734
  STEP(195, "(printing code cache information)" )
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   735
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   736
     if (_verbose && Universe::is_fully_initialized()) {
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   737
       // print code cache information before vm abort
15201
f3d755b11424 8005204: Code Cache Reduction: command line options implementation
vladidan
parents: 14477
diff changeset
   738
       CodeCache::print_summary(st);
7108
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   739
       st->cr();
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   740
     }
4f87b92f3060 6970683: improvements to hs_err output
never
parents: 6184
diff changeset
   741
11636
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   742
  STEP(200, "(printing ring buffers)" )
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   743
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   744
     if (_verbose) {
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   745
       Events::print_all(st);
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   746
       st->cr();
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   747
     }
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   748
3c07b54482a5 7141200: log some interesting information in ring buffers for crashes
never
parents: 11483
diff changeset
   749
  STEP(205, "(printing dynamic libraries)" )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
       // dynamic libraries, or memory map
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
       os::print_dll_info(st);
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  STEP(210, "(printing VM options)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
       // VM options
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
       Arguments::print_on(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
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   765
  STEP(215, "(printing warning if internal testing API used)" )
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   766
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   767
     if (WhiteBox::used()) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   768
       st->print_cr("Unsupported internal testing APIs have been used.");
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   769
       st->cr();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   770
     }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents: 11636
diff changeset
   771
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  STEP(220, "(printing environment variables)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
     if (_verbose) {
30125
8ba6e8e367e9 8074895: os::getenv is inadequate
jmanson
parents: 29573
diff changeset
   775
       os::print_environment_variables(st, env_list);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  STEP(225, "(printing signal handlers)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
       os::print_signal_handlers(st, buf, sizeof(buf));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   786
  STEP(228, "(Native Memory Tracking)" )
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   787
     if (_verbose) {
27162
0a4a7276949b 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 26821
diff changeset
   788
       MemTracker::error_report(st);
25946
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   789
     }
1572c9f03fb9 8046598: Scalable Native memory tracking development
zgu
parents: 25719
diff changeset
   790
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  STEP(230, "" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
       st->print_cr("---------------  S Y S T E M  ---------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  STEP(240, "(printing OS information)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
       os::print_os_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
  STEP(250, "(printing CPU info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
       os::print_cpu_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  STEP(260, "(printing memory info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
       os::print_memory_info(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  STEP(270, "(printing internal vm info)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
       st->print_cr("vm_info: %s", Abstract_VM_Version::internal_vm_info_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  STEP(280, "(printing date and time)" )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
     if (_verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
       os::print_date_and_time(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
       st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
28943
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   833
#ifndef PRODUCT
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   834
  // print a defined marker to show that error handling finished correctly.
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   835
  STEP(290, "(printing end marker)" )
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   836
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   837
     if (_verbose) {
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   838
       st->print_cr("END.");
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   839
     }
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   840
#endif
679546f0cc1f 8065895: Synchronous signals during error reporting may terminate or hang VM process
dholmes
parents: 28513
diff changeset
   841
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
# undef BEGIN
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
# undef STEP
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
# undef END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   849
VMError* volatile VMError::first_error = NULL;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   850
volatile jlong VMError::first_error_tid = -1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
18487
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   852
// 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
   853
// 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
   854
// 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
   855
// 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
   856
// 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
   857
fdStream VMError::out(defaultStream::output_fd());
270ef05ebce8 7060111: race condition in VMError::report_and_die()
fparain
parents: 17134
diff changeset
   858
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
   859
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   860
/** 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
   861
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
   862
  int fd = -1;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   863
  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
   864
    // 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
   865
    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
   866
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   867
  return fd;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   868
}
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   869
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   870
/**
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   871
 * 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
   872
 * 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
   873
 * permissions.
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   874
 */
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   875
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
   876
  int fd = -1;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   877
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   878
  // 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
   879
  if (pattern != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   880
    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
   881
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   882
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   883
  // 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
   884
  // 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
   885
  if (fd == -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   886
    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
   887
    if (cwd != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   888
      size_t pos = strlen(cwd);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   889
      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
   890
      pos += fsep_len;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   891
      if (fsep_len > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   892
        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
   893
      }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   894
    }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   895
  }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   896
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   897
   // try temp directory if it exists.
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   898
   if (fd == -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   899
     const char* tmpdir = os::get_temp_directory();
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   900
     if (tmpdir != NULL && strlen(tmpdir) > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   901
       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
   902
       if (pos > 0) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   903
         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
   904
       }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   905
     }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   906
   }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   907
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   908
  return fd;
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   909
}
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
   910
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
void VMError::report_and_die() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  // How many errors occurred in error handler when reporting first_error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  static int recursive_error_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  // We will first print a brief message to standard out (verbose = false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  // then save detailed information in log file (verbose = true).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  static bool out_done = false;         // done printing to standard out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  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
   922
  static bool transmit_report_done = false; // done error reporting
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  if (SuppressFatalErrorMessage) {
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   925
      os::abort(CreateCoredumpOnCrash);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  jlong mytid = os::current_thread_id();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  if (first_error == NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
      Atomic::cmpxchg_ptr(this, &first_error, NULL) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    // first time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
    first_error_tid = mytid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
    set_error_reported();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
8476
7e34c2d4cf9b 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 8119
diff changeset
   935
    if (ShowMessageBoxOnError || PauseAtExit) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
      show_message_box(buffer, sizeof(buffer));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
      // User has asked JVM to abort. Reset ShowMessageBoxOnError so the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
      // WatcherThread can kill JVM if the error handler hangs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
      ShowMessageBoxOnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
30240
a7ba42fa1df6 8074354: Make CreateMinidumpOnCrash a new name and available on all platforms
minqi
parents: 30125
diff changeset
   943
    os::check_dump_limit(buffer, sizeof(buffer));
8119
81eef1b06988 7014918: Improve core/minidump handling in Hotspot
ctornqvi
parents: 8114
diff changeset
   944
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
    // reset signal handlers or exception filter; make sure recursive crashes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
    // are handled properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
    reset_signal_handlers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  } else {
1887
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   950
    // 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
   951
    // 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
   952
    // to be reported.
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   953
    if (UseOSErrorReporting && log_done) return;
0ed88ac17540 4997835: RFE: crash dump will only be created when running w/ -XX:+ShowMessageBoxOnError
coleenp
parents: 1660
diff changeset
   954
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
    // This is not the first error, see if it happened in a different thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    // or in the same thread during error reporting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    if (first_error_tid != mytid) {
18684
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
   958
      char msgbuf[64];
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
   959
      jio_snprintf(msgbuf, sizeof(msgbuf),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
                   "[thread " INT64_FORMAT " also had an error]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
                   mytid);
18684
79e53d93bc13 8016465: The hs_err file gets wrong name
fparain
parents: 18487
diff changeset
   962
      out.print_raw_cr(msgbuf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
      // error reporting is not MT-safe, block current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
      os::infinite_sleep();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
      if (recursive_error_count++ > 30) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
        out.print_raw_cr("[Too many errors, abort]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
        os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
      jio_snprintf(buffer, sizeof(buffer),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
                   "[error occurred during error reporting %s, id 0x%x]",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
                   first_error ? first_error->_current_step_info : "",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
                   _id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
      if (log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
        log.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
        log.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
        out.cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // print to screen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  if (!out_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
    first_error->_verbose = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    staticBufferStream sbs(buffer, sizeof(buffer), &out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
    out_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  // print to error log file
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  if (!log_done) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
    first_error->_verbose = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
    // see if log file is already open
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
    if (!log.is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
      // open log file
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1009
      int fd = prepare_log_file(ErrorFile, "hs_err_pid%p.log", buffer, sizeof(buffer));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
      if (fd != -1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
        out.print_raw("# An error report file with more information is saved as:\n# ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
        out.print_raw_cr(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
        log.set_fd(fd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
        out.print_raw_cr("# Can not save log file, dump to screen..");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
        log.set_fd(defaultStream::output_fd());
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1018
        /* Error reporting currently needs dumpfile.
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1019
         * Maybe implement direct streaming in the future.*/
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1020
        transmit_report_done = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    staticBufferStream sbs(buffer, O_BUFLEN, &log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
    first_error->report(&sbs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
    first_error->_current_step = 0;         // reset current_step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
    first_error->_current_step_info = "";   // reset current_step string
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1029
    // 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
  1030
    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
  1031
      transmit_report_done = true;
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1032
      const int fd2 = ::dup(log.fd());
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1033
      FILE* const hs_err = ::fdopen(fd2, "r");
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1034
      if (NULL != hs_err) {
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1035
        ErrorReporter er;
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1036
        er.call(hs_err, buffer, O_BUFLEN);
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1037
      }
27471
6e56277909f1 8062370: Various minor code improvements
goetz
parents: 27162
diff changeset
  1038
      ::fclose(hs_err);
8114
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1039
    }
340b5b8b544b 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 7901
diff changeset
  1040
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
    if (log.fd() != defaultStream::output_fd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
      close(log.fd());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    log.set_fd(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
    log_done = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  static bool skip_OnError = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  if (!skip_OnError && OnError && OnError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
    skip_OnError = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
    out.print_raw_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
    out.print_raw   ("# -XX:OnError=\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    out.print_raw   (OnError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
    out.print_raw_cr("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
    char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
    const char* ptr = OnError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
    while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
      out.print_raw   ("#   Executing ");
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 8476
diff changeset
  1063
#if defined(LINUX) || defined(_ALLBSD_SOURCE)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
      out.print_raw   ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
      out.print_raw   ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
      out.print_raw   ("\"");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      out.print_raw   (cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
      out.print_raw_cr("\" ...");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
      os::fork_and_exec(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
    // done with OnError
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
    OnError = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
22243
91944eab7b92 8028468: Add inlining information into ciReplay
kvn
parents: 20692
diff changeset
  1079
  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
  1080
  if (DumpReplayDataOnError && _thread && _thread->is_Compiler_thread() && !skip_replay) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1081
    skip_replay = true;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1082
    ciEnv* env = ciEnv::current();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1083
    if (env != NULL) {
17121
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1084
      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
  1085
      if (fd != -1) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1086
        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
  1087
        if (replay_data_file != NULL) {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1088
          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
  1089
          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
  1090
          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
  1091
          out.print_raw_cr(buffer);
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1092
        } else {
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1093
          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
  1094
          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
  1095
        }
e40a97c700d9 8012260: ciReplay: Include PID into the name of replay data file
vlivanov
parents: 16685
diff changeset
  1096
      }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1097
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1098
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14289
diff changeset
  1099
7719
ef138e2849eb 6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents: 7447
diff changeset
  1100
  static bool skip_bug_url = !should_report_bug(first_error->_id);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  if (!skip_bug_url) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    skip_bug_url = 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
    print_bug_submit_message(&out, _thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  if (!UseOSErrorReporting) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
    // os::abort() will call abort hooks, try it first.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    static bool skip_os_abort = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    if (!skip_os_abort) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
      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
  1113
      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
  1114
      os::abort(dump_core && CreateCoredumpOnCrash, _siginfo, _context);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
    // if os::abort() doesn't abort, try os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    os::die();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
 * OnOutOfMemoryError scripts/commands executed while VM is a safepoint - this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
 * ensures utilities such as jmap can observe the process is a consistent state.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
class VM_ReportJavaOutOfMemory : public VM_Operation {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  VMError *_err;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  VM_ReportJavaOutOfMemory(VMError *err) { _err = err; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  VMOp_Type type() const                 { return VMOp_ReportJavaOutOfMemory; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  void doit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
void VM_ReportJavaOutOfMemory::doit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  // Don't allocate large buffer on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  static char buffer[O_BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  tty->print_cr("#");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  tty->print_cr("# java.lang.OutOfMemoryError: %s", _err->message());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  tty->print_cr("# -XX:OnOutOfMemoryError=\"%s\"", OnOutOfMemoryError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  // make heap parsability
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
  Universe::heap()->ensure_parsability(false);  // no need to retire TLABs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  char* cmd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  const char* ptr = OnOutOfMemoryError;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
  while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
    tty->print("#   Executing ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
#if defined(LINUX)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
    tty->print  ("/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
#elif defined(SOLARIS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
    tty->print  ("/usr/bin/sh -c ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
    tty->print_cr("\"%s\"...", cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
    os::fork_and_exec(cmd);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
void VMError::report_java_out_of_memory() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
    MutexLocker ml(Heap_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
    VM_ReportJavaOutOfMemory op(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    VMThread::execute(&op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
}