annotate src/share/vm/utilities/vmError.cpp @ 1994:6cd6d394f280

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