Mercurial > hg > truffle
annotate src/share/vm/utilities/debug.cpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | 78bbf4d43a14 |
children | 52b4284cb496 03e6d34be1f5 |
rev | line source |
---|---|
0 | 1 /* |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
11092
diff
changeset
|
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
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 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" | |
27 #include "code/codeCache.hpp" | |
28 #include "code/icBuffer.hpp" | |
29 #include "code/nmethod.hpp" | |
30 #include "code/vtableStubs.hpp" | |
31 #include "compiler/compileBroker.hpp" | |
32 #include "compiler/disassembler.hpp" | |
33 #include "gc_implementation/shared/markSweep.hpp" | |
34 #include "gc_interface/collectedHeap.hpp" | |
35 #include "interpreter/bytecodeHistogram.hpp" | |
36 #include "interpreter/interpreter.hpp" | |
37 #include "memory/resourceArea.hpp" | |
38 #include "memory/universe.hpp" | |
39 #include "oops/oop.inline.hpp" | |
40 #include "prims/privilegedStack.hpp" | |
41 #include "runtime/arguments.hpp" | |
42 #include "runtime/frame.hpp" | |
43 #include "runtime/java.hpp" | |
44 #include "runtime/sharedRuntime.hpp" | |
45 #include "runtime/stubCodeGenerator.hpp" | |
46 #include "runtime/stubRoutines.hpp" | |
7180
f34d701e952e
8003935: Simplify the needed includes for using Thread::current()
stefank
parents:
6865
diff
changeset
|
47 #include "runtime/thread.inline.hpp" |
1972 | 48 #include "runtime/vframe.hpp" |
49 #include "services/heapDumper.hpp" | |
50 #include "utilities/defaultStream.hpp" | |
51 #include "utilities/events.hpp" | |
52 #include "utilities/top.hpp" | |
53 #include "utilities/vmError.hpp" | |
54 #ifdef TARGET_OS_FAMILY_linux | |
55 # include "os_linux.inline.hpp" | |
56 #endif | |
57 #ifdef TARGET_OS_FAMILY_solaris | |
58 # include "os_solaris.inline.hpp" | |
59 #endif | |
60 #ifdef TARGET_OS_FAMILY_windows | |
61 # include "os_windows.inline.hpp" | |
62 #endif | |
3960 | 63 #ifdef TARGET_OS_FAMILY_bsd |
64 # include "os_bsd.inline.hpp" | |
65 #endif | |
0 | 66 |
67 #ifndef ASSERT | |
68 # ifdef _DEBUG | |
69 // NOTE: don't turn the lines below into a comment -- if you're getting | |
70 // a compile error here, change the settings to define ASSERT | |
71 ASSERT should be defined when _DEBUG is defined. It is not intended to be used for debugging | |
72 functions that do not slow down the system too much and thus can be left in optimized code. | |
73 On the other hand, the code should not be included in a production version. | |
74 # endif // _DEBUG | |
75 #endif // ASSERT | |
76 | |
77 | |
78 #ifdef _DEBUG | |
79 # ifndef ASSERT | |
80 configuration error: ASSERT must be defined in debug version | |
81 # endif // ASSERT | |
82 #endif // _DEBUG | |
83 | |
84 | |
85 #ifdef PRODUCT | |
86 # if -defined _DEBUG || -defined ASSERT | |
87 configuration error: ASSERT et al. must not be defined in PRODUCT version | |
88 # endif | |
89 #endif // PRODUCT | |
90 | |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
11092
diff
changeset
|
91 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC |
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
11092
diff
changeset
|
92 |
6268
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
93 FormatBufferResource::FormatBufferResource(const char * format, ...) |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
94 : FormatBufferBase((char*)resource_allocate_bytes(RES_BUFSZ)) { |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
95 va_list argp; |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
96 va_start(argp, format); |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
97 jio_vsnprintf(_buf, RES_BUFSZ, format, argp); |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
98 va_end(argp); |
6c5b7a6becc8
7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents:
4944
diff
changeset
|
99 } |
0 | 100 |
17937
78bbf4d43a14
8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents:
11092
diff
changeset
|
101 ATTRIBUTE_PRINTF(1, 2) |
0 | 102 void warning(const char* format, ...) { |
1870
c77b5c592eab
6392697: Additional flag needed to supress Hotspot warning messages
kamg
parents:
1775
diff
changeset
|
103 if (PrintWarnings) { |
6759 | 104 FILE* const err = defaultStream::error_stream(); |
105 jio_fprintf(err, "%s warning: ", VM_Version::vm_name()); | |
1870
c77b5c592eab
6392697: Additional flag needed to supress Hotspot warning messages
kamg
parents:
1775
diff
changeset
|
106 va_list ap; |
c77b5c592eab
6392697: Additional flag needed to supress Hotspot warning messages
kamg
parents:
1775
diff
changeset
|
107 va_start(ap, format); |
6759 | 108 vfprintf(err, format, ap); |
1870
c77b5c592eab
6392697: Additional flag needed to supress Hotspot warning messages
kamg
parents:
1775
diff
changeset
|
109 va_end(ap); |
6759 | 110 fputc('\n', err); |
1870
c77b5c592eab
6392697: Additional flag needed to supress Hotspot warning messages
kamg
parents:
1775
diff
changeset
|
111 } |
0 | 112 if (BreakAtWarning) BREAKPOINT; |
113 } | |
114 | |
115 #ifndef PRODUCT | |
116 | |
117 #define is_token_break(ch) (isspace(ch) || (ch) == ',') | |
118 | |
119 static const char* last_file_name = NULL; | |
120 static int last_line_no = -1; | |
121 | |
122 // assert/guarantee/... may happen very early during VM initialization. | |
123 // Don't rely on anything that is initialized by Threads::create_vm(). For | |
124 // example, don't use tty. | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
125 bool error_is_suppressed(const char* file_name, int line_no) { |
0 | 126 // The following 1-element cache requires that passed-in |
127 // file names are always only constant literals. | |
128 if (file_name == last_file_name && line_no == last_line_no) return true; | |
129 | |
130 int file_name_len = (int)strlen(file_name); | |
131 char separator = os::file_separator()[0]; | |
132 const char* base_name = strrchr(file_name, separator); | |
133 if (base_name == NULL) | |
134 base_name = file_name; | |
135 | |
136 // scan the SuppressErrorAt option | |
137 const char* cp = SuppressErrorAt; | |
138 for (;;) { | |
139 const char* sfile; | |
140 int sfile_len; | |
141 int sline; | |
142 bool noisy; | |
143 while ((*cp) != '\0' && is_token_break(*cp)) cp++; | |
144 if ((*cp) == '\0') break; | |
145 sfile = cp; | |
146 while ((*cp) != '\0' && !is_token_break(*cp) && (*cp) != ':') cp++; | |
147 sfile_len = cp - sfile; | |
148 if ((*cp) == ':') cp++; | |
149 sline = 0; | |
150 while ((*cp) != '\0' && isdigit(*cp)) { | |
151 sline *= 10; | |
152 sline += (*cp) - '0'; | |
153 cp++; | |
154 } | |
155 // "file:line!" means the assert suppression is not silent | |
156 noisy = ((*cp) == '!'); | |
157 while ((*cp) != '\0' && !is_token_break(*cp)) cp++; | |
158 // match the line | |
159 if (sline != 0) { | |
160 if (sline != line_no) continue; | |
161 } | |
162 // match the file | |
163 if (sfile_len > 0) { | |
164 const char* look = file_name; | |
165 const char* look_max = file_name + file_name_len - sfile_len; | |
166 const char* foundp; | |
167 bool match = false; | |
168 while (!match | |
169 && (foundp = strchr(look, sfile[0])) != NULL | |
170 && foundp <= look_max) { | |
171 match = true; | |
172 for (int i = 1; i < sfile_len; i++) { | |
173 if (sfile[i] != foundp[i]) { | |
174 match = false; | |
175 break; | |
176 } | |
177 } | |
178 look = foundp + 1; | |
179 } | |
180 if (!match) continue; | |
181 } | |
182 // got a match! | |
183 if (noisy) { | |
184 fdStream out(defaultStream::output_fd()); | |
185 out.print_raw("[error suppressed at "); | |
186 out.print_raw(base_name); | |
187 char buf[16]; | |
188 jio_snprintf(buf, sizeof(buf), ":%d]", line_no); | |
189 out.print_raw_cr(buf); | |
190 } else { | |
191 // update 1-element cache for fast silent matches | |
192 last_file_name = file_name; | |
193 last_line_no = line_no; | |
194 } | |
195 return true; | |
196 } | |
197 | |
198 if (!is_error_reported()) { | |
199 // print a friendly hint: | |
200 fdStream out(defaultStream::output_fd()); | |
201 out.print_raw_cr("# To suppress the following error report, specify this argument"); | |
202 out.print_raw ("# after -XX: or in .hotspotrc: SuppressErrorAt="); | |
203 out.print_raw (base_name); | |
204 char buf[16]; | |
205 jio_snprintf(buf, sizeof(buf), ":%d", line_no); | |
206 out.print_raw_cr(buf); | |
207 } | |
208 return false; | |
209 } | |
210 | |
211 #undef is_token_break | |
212 | |
213 #else | |
214 | |
215 // Place-holder for non-existent suppression check: | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
216 #define error_is_suppressed(file_name, line_no) (false) |
0 | 217 |
4006 | 218 #endif // !PRODUCT |
0 | 219 |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
220 void report_vm_error(const char* file, int line, const char* error_msg, |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
221 const char* detail_msg) |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
222 { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
223 if (Debugging || error_is_suppressed(file, line)) return; |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
224 Thread* const thread = ThreadLocalStorage::get_thread_slow(); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
225 VMError err(thread, file, line, error_msg, detail_msg); |
0 | 226 err.report_and_die(); |
227 } | |
228 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
229 void report_fatal(const char* file, int line, const char* message) |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
230 { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
231 report_vm_error(file, line, "fatal error", message); |
0 | 232 } |
233 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
234 void report_vm_out_of_memory(const char* file, int line, size_t size, |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
9060
diff
changeset
|
235 VMErrorType vm_err_type, const char* message) { |
2095
36c186bcc085
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents:
2008
diff
changeset
|
236 if (Debugging) return; |
0 | 237 |
8101
b6d5b3e50379
6799919: Recursive calls to report_vm_out_of_memory are handled incorrectly
dcubed
parents:
7448
diff
changeset
|
238 Thread* thread = ThreadLocalStorage::get_thread_slow(); |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
9060
diff
changeset
|
239 VMError(thread, file, line, size, vm_err_type, message).report_and_die(); |
0 | 240 |
8101
b6d5b3e50379
6799919: Recursive calls to report_vm_out_of_memory are handled incorrectly
dcubed
parents:
7448
diff
changeset
|
241 // The UseOSErrorReporting option in report_and_die() may allow a return |
b6d5b3e50379
6799919: Recursive calls to report_vm_out_of_memory are handled incorrectly
dcubed
parents:
7448
diff
changeset
|
242 // to here. If so then we'll have to figure out how to handle it. |
b6d5b3e50379
6799919: Recursive calls to report_vm_out_of_memory are handled incorrectly
dcubed
parents:
7448
diff
changeset
|
243 guarantee(false, "report_and_die() should not return here"); |
0 | 244 } |
245 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
246 void report_should_not_call(const char* file, int line) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
247 report_vm_error(file, line, "ShouldNotCall()"); |
0 | 248 } |
249 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
250 void report_should_not_reach_here(const char* file, int line) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
251 report_vm_error(file, line, "ShouldNotReachHere()"); |
0 | 252 } |
253 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
254 void report_unimplemented(const char* file, int line) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
255 report_vm_error(file, line, "Unimplemented()"); |
0 | 256 } |
257 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
258 void report_untested(const char* file, int line, const char* message) { |
0 | 259 #ifndef PRODUCT |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
260 warning("Untested: %s in %s: %d\n", message, file, line); |
4006 | 261 #endif // !PRODUCT |
0 | 262 } |
263 | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
264 void report_out_of_shared_space(SharedSpaceType shared_space) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
265 static const char* name[] = { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
266 "native memory for metadata", |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
267 "shared read only space", |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
268 "shared read write space", |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
269 "shared miscellaneous data space" |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
270 }; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
271 static const char* flag[] = { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
272 "Metaspace", |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
273 "SharedReadOnlySize", |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
274 "SharedReadWriteSize", |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
275 "SharedMiscDataSize" |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
276 }; |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
277 |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
278 warning("\nThe %s is not large enough\n" |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
279 "to preload requested classes. Use -XX:%s=\n" |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
280 "to increase the initial size of %s.\n", |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
281 name[shared_space], flag[shared_space], name[shared_space]); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
282 exit(2); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
283 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2095
diff
changeset
|
284 |
0 | 285 void report_java_out_of_memory(const char* message) { |
286 static jint out_of_memory_reported = 0; | |
287 | |
288 // A number of threads may attempt to report OutOfMemoryError at around the | |
289 // same time. To avoid dumping the heap or executing the data collection | |
290 // commands multiple times we just do it once when the first threads reports | |
291 // the error. | |
292 if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) { | |
293 // create heap dump before OnOutOfMemoryError commands are executed | |
294 if (HeapDumpOnOutOfMemoryError) { | |
295 tty->print_cr("java.lang.OutOfMemoryError: %s", message); | |
1775
30f67acf635d
6765718: Indicate which thread throwing OOME when generating the heap dump at OOME
thurka
parents:
1681
diff
changeset
|
296 HeapDumper::dump_heap_from_oome(); |
0 | 297 } |
298 | |
299 if (OnOutOfMemoryError && OnOutOfMemoryError[0]) { | |
300 VMError err(message); | |
301 err.report_java_out_of_memory(); | |
302 } | |
303 } | |
304 } | |
305 | |
306 static bool error_reported = false; | |
307 | |
308 // call this when the VM is dying--it might loosen some asserts | |
309 void set_error_reported() { | |
310 error_reported = true; | |
311 } | |
312 | |
313 bool is_error_reported() { | |
314 return error_reported; | |
315 } | |
316 | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
317 #ifndef PRODUCT |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
318 #include <signal.h> |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
319 |
11092
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
320 void test_error_handler() { |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
321 uintx test_num = ErrorHandlerTest; |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
322 if (test_num == 0) return; |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
323 |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
324 // If asserts are disabled, use the corresponding guarantee instead. |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
325 size_t n = test_num; |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
326 NOT_DEBUG(if (n <= 2) n += 2); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
327 |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
328 const char* const str = "hello"; |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
329 const size_t num = (size_t)os::vm_page_size(); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
330 |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
331 const char* const eol = os::line_separator(); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
332 const char* const msg = "this message should be truncated during formatting"; |
11092
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
333 char * const dataPtr = NULL; // bad data pointer |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
334 const void (*funcPtr)(void) = (const void(*)()) 0xF; // bad function pointer |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
335 |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
336 // Keep this in sync with test/runtime/6888954/vmerrors.sh. |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
337 switch (n) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
338 case 1: assert(str == NULL, "expected null"); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
339 case 2: assert(num == 1023 && *str == 'X', |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
340 err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str)); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
341 case 3: guarantee(str == NULL, "expected null"); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
342 case 4: guarantee(num == 1023 && *str == 'X', |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
343 err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str)); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
344 case 5: fatal("expected null"); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
345 case 6: fatal(err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str)); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
346 case 7: fatal(err_msg("%s%s# %s%s# %s%s# %s%s# %s%s# " |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
347 "%s%s# %s%s# %s%s# %s%s# %s%s# " |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
348 "%s%s# %s%s# %s%s# %s%s# %s", |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
349 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol, |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
350 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol, |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
351 msg, eol, msg, eol, msg, eol, msg, eol, msg)); |
10161
746b070f5022
8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents:
9060
diff
changeset
|
352 case 8: vm_exit_out_of_memory(num, OOM_MALLOC_ERROR, "ChunkPool::allocate"); |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
353 case 9: ShouldNotCallThis(); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
354 case 10: ShouldNotReachHere(); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
355 case 11: Unimplemented(); |
11092
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
356 // There's no guarantee the bad data pointer will crash us |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
357 // so "break" out to the ShouldNotReachHere(). |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
358 case 12: *dataPtr = '\0'; break; |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
359 // There's no guarantee the bad function pointer will crash us |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
360 // so "break" out to the ShouldNotReachHere(). |
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
361 case 13: (*funcPtr)(); break; |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
362 |
11092
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
363 default: tty->print_cr("ERROR: %d: unexpected test_num value.", n); |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
364 } |
11092
59b052799158
8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents:
10308
diff
changeset
|
365 ShouldNotReachHere(); |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
366 } |
4006 | 367 #endif // !PRODUCT |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
989
diff
changeset
|
368 |
0 | 369 // ------ helper functions for debugging go here ------------ |
370 | |
371 // All debug entries should be wrapped with a stack allocated | |
372 // Command object. It makes sure a resource mark is set and | |
373 // flushes the logfile to prevent file sharing problems. | |
374 | |
375 class Command : public StackObj { | |
376 private: | |
377 ResourceMark rm; | |
378 ResetNoHandleMark rnhm; | |
379 HandleMark hm; | |
380 bool debug_save; | |
381 public: | |
382 static int level; | |
383 Command(const char* str) { | |
384 debug_save = Debugging; | |
385 Debugging = true; | |
386 if (level++ > 0) return; | |
387 tty->cr(); | |
388 tty->print_cr("\"Executing %s\"", str); | |
389 } | |
390 | |
4006 | 391 ~Command() { |
392 tty->flush(); | |
393 Debugging = debug_save; | |
394 level--; | |
395 } | |
0 | 396 }; |
397 | |
398 int Command::level = 0; | |
399 | |
4006 | 400 #ifndef PRODUCT |
401 | |
0 | 402 extern "C" void blob(CodeBlob* cb) { |
403 Command c("blob"); | |
404 cb->print(); | |
405 } | |
406 | |
407 | |
408 extern "C" void dump_vtable(address p) { | |
409 Command c("dump_vtable"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
410 Klass* k = (Klass*)p; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
411 InstanceKlass::cast(k)->vtable()->print(); |
0 | 412 } |
413 | |
414 | |
415 extern "C" void nm(intptr_t p) { | |
416 // Actually we look through all CodeBlobs (the nm name has been kept for backwards compatability) | |
417 Command c("nm"); | |
418 CodeBlob* cb = CodeCache::find_blob((address)p); | |
419 if (cb == NULL) { | |
420 tty->print_cr("NULL"); | |
421 } else { | |
422 cb->print(); | |
423 } | |
424 } | |
425 | |
426 | |
427 extern "C" void disnm(intptr_t p) { | |
428 Command c("disnm"); | |
429 CodeBlob* cb = CodeCache::find_blob((address) p); | |
2008 | 430 nmethod* nm = cb->as_nmethod_or_null(); |
431 if (nm) { | |
432 nm->print(); | |
433 Disassembler::decode(nm); | |
434 } else { | |
435 cb->print(); | |
436 Disassembler::decode(cb); | |
437 } | |
0 | 438 } |
439 | |
440 | |
441 extern "C" void printnm(intptr_t p) { | |
442 char buffer[256]; | |
443 sprintf(buffer, "printnm: " INTPTR_FORMAT, p); | |
444 Command c(buffer); | |
445 CodeBlob* cb = CodeCache::find_blob((address) p); | |
446 if (cb->is_nmethod()) { | |
447 nmethod* nm = (nmethod*)cb; | |
448 nm->print_nmethod(true); | |
449 } | |
450 } | |
451 | |
452 | |
453 extern "C" void universe() { | |
454 Command c("universe"); | |
455 Universe::print(); | |
456 } | |
457 | |
458 | |
459 extern "C" void verify() { | |
460 // try to run a verify on the entire system | |
461 // note: this may not be safe if we're not at a safepoint; for debugging, | |
462 // this manipulates the safepoint settings to avoid assertion failures | |
463 Command c("universe verify"); | |
464 bool safe = SafepointSynchronize::is_at_safepoint(); | |
465 if (!safe) { | |
466 tty->print_cr("warning: not at safepoint -- verify may fail"); | |
467 SafepointSynchronize::set_is_at_safepoint(); | |
468 } | |
469 // Ensure Eden top is correct before verification | |
470 Universe::heap()->prepare_for_verify(); | |
6865
4202510ee0fe
8000831: Heap verification output incorrect/incomplete
johnc
parents:
6759
diff
changeset
|
471 Universe::verify(); |
0 | 472 if (!safe) SafepointSynchronize::set_is_not_at_safepoint(); |
473 } | |
474 | |
475 | |
476 extern "C" void pp(void* p) { | |
477 Command c("pp"); | |
478 FlagSetting fl(PrintVMMessages, true); | |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
479 FlagSetting f2(DisplayVMOutput, true); |
0 | 480 if (Universe::heap()->is_in(p)) { |
481 oop obj = oop(p); | |
482 obj->print(); | |
483 } else { | |
4006 | 484 tty->print(PTR_FORMAT, p); |
0 | 485 } |
486 } | |
487 | |
488 | |
489 // pv: print vm-printable object | |
490 extern "C" void pa(intptr_t p) { ((AllocatedObj*) p)->print(); } | |
491 extern "C" void findpc(intptr_t x); | |
492 | |
4006 | 493 #endif // !PRODUCT |
494 | |
0 | 495 extern "C" void ps() { // print stack |
4006 | 496 if (Thread::current() == NULL) return; |
0 | 497 Command c("ps"); |
498 | |
499 | |
500 // Prints the stack of the current Java thread | |
501 JavaThread* p = JavaThread::active(); | |
502 tty->print(" for thread: "); | |
503 p->print(); | |
504 tty->cr(); | |
505 | |
506 if (p->has_last_Java_frame()) { | |
507 // If the last_Java_fp is set we are in C land and | |
508 // can call the standard stack_trace function. | |
4006 | 509 #ifdef PRODUCT |
510 p->print_stack(); | |
511 } else { | |
512 tty->print_cr("Cannot find the last Java frame, printing stack disabled."); | |
513 #else // !PRODUCT | |
0 | 514 p->trace_stack(); |
515 } else { | |
516 frame f = os::current_frame(); | |
517 RegisterMap reg_map(p); | |
518 f = f.sender(®_map); | |
519 tty->print("(guessing starting frame id=%#p based on current fp)\n", f.id()); | |
520 p->trace_stack_from(vframe::new_vframe(&f, ®_map, p)); | |
521 pd_ps(f); | |
4006 | 522 #endif // PRODUCT |
0 | 523 } |
524 | |
525 } | |
526 | |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
527 extern "C" void pfl() { |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
528 // print frame layout |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
529 Command c("pfl"); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
530 JavaThread* p = JavaThread::active(); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
531 tty->print(" for thread: "); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
532 p->print(); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
533 tty->cr(); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
534 if (p->has_last_Java_frame()) { |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
535 p->print_frame_layout(); |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
536 } |
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2426
diff
changeset
|
537 } |
0 | 538 |
4006 | 539 #ifndef PRODUCT |
540 | |
0 | 541 extern "C" void psf() { // print stack frames |
542 { | |
543 Command c("psf"); | |
544 JavaThread* p = JavaThread::active(); | |
545 tty->print(" for thread: "); | |
546 p->print(); | |
547 tty->cr(); | |
548 if (p->has_last_Java_frame()) { | |
549 p->trace_frames(); | |
550 } | |
551 } | |
552 } | |
553 | |
554 | |
555 extern "C" void threads() { | |
556 Command c("threads"); | |
557 Threads::print(false, true); | |
558 } | |
559 | |
560 | |
561 extern "C" void psd() { | |
562 Command c("psd"); | |
563 SystemDictionary::print(); | |
564 } | |
565 | |
566 | |
567 extern "C" void safepoints() { | |
568 Command c("safepoints"); | |
569 SafepointSynchronize::print_state(); | |
570 } | |
571 | |
4006 | 572 #endif // !PRODUCT |
0 | 573 |
574 extern "C" void pss() { // print all stacks | |
4006 | 575 if (Thread::current() == NULL) return; |
0 | 576 Command c("pss"); |
4006 | 577 Threads::print(true, PRODUCT_ONLY(false) NOT_PRODUCT(true)); |
0 | 578 } |
579 | |
4006 | 580 #ifndef PRODUCT |
0 | 581 |
582 extern "C" void debug() { // to set things up for compiler debugging | |
583 Command c("debug"); | |
584 WizardMode = true; | |
585 PrintVMMessages = PrintCompilation = true; | |
586 PrintInlining = PrintAssembly = true; | |
587 tty->flush(); | |
588 } | |
589 | |
590 | |
591 extern "C" void ndebug() { // undo debug() | |
592 Command c("ndebug"); | |
593 PrintCompilation = false; | |
594 PrintInlining = PrintAssembly = false; | |
595 tty->flush(); | |
596 } | |
597 | |
598 | |
599 extern "C" void flush() { | |
600 Command c("flush"); | |
601 tty->flush(); | |
602 } | |
603 | |
4944 | 604 extern "C" void events() { |
605 Command c("events"); | |
606 Events::print(); | |
607 } | |
0 | 608 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
609 extern "C" Method* findm(intptr_t pc) { |
0 | 610 Command c("findm"); |
611 nmethod* nm = CodeCache::find_nmethod((address)pc); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
612 return (nm == NULL) ? (Method*)NULL : nm->method(); |
0 | 613 } |
614 | |
615 | |
616 extern "C" nmethod* findnm(intptr_t addr) { | |
617 Command c("findnm"); | |
618 return CodeCache::find_nmethod((address)addr); | |
619 } | |
620 | |
621 // Another interface that isn't ambiguous in dbx. | |
622 // Can we someday rename the other find to hsfind? | |
623 extern "C" void hsfind(intptr_t x) { | |
624 Command c("hsfind"); | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1552
diff
changeset
|
625 os::print_location(tty, x, false); |
0 | 626 } |
627 | |
628 | |
629 extern "C" void find(intptr_t x) { | |
630 Command c("find"); | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1552
diff
changeset
|
631 os::print_location(tty, x, false); |
0 | 632 } |
633 | |
634 | |
635 extern "C" void findpc(intptr_t x) { | |
636 Command c("findpc"); | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1552
diff
changeset
|
637 os::print_location(tty, x, true); |
0 | 638 } |
639 | |
640 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
641 // Need method pointer to find bcp, when not in permgen. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
642 extern "C" void findbcp(intptr_t method, intptr_t bcp) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
643 Command c("findbcp"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
644 Method* mh = (Method*)method; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
645 if (!mh->is_native()) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
646 tty->print_cr("bci_from(%p) = %d; print_codes():", |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
647 mh, mh->bci_from(address(bcp))); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
648 mh->print_codes_on(tty); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
649 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
650 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
651 |
0 | 652 // int versions of all methods to avoid having to type type casts in the debugger |
653 | |
654 void pp(intptr_t p) { pp((void*)p); } | |
655 void pp(oop p) { pp((void*)p); } | |
656 | |
657 void help() { | |
658 Command c("help"); | |
659 tty->print_cr("basic"); | |
660 tty->print_cr(" pp(void* p) - try to make sense of p"); | |
661 tty->print_cr(" pv(intptr_t p)- ((PrintableResourceObj*) p)->print()"); | |
662 tty->print_cr(" ps() - print current thread stack"); | |
663 tty->print_cr(" pss() - print all thread stacks"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
664 tty->print_cr(" pm(int pc) - print Method* given compiled PC"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6268
diff
changeset
|
665 tty->print_cr(" findm(intptr_t pc) - finds Method*"); |
0 | 666 tty->print_cr(" find(intptr_t x) - finds & prints nmethod/stub/bytecode/oop based on pointer into it"); |
667 | |
668 tty->print_cr("misc."); | |
669 tty->print_cr(" flush() - flushes the log file"); | |
4944 | 670 tty->print_cr(" events() - dump events from ring buffers"); |
0 | 671 |
672 | |
673 tty->print_cr("compiler debugging"); | |
674 tty->print_cr(" debug() - to set things up for compiler debugging"); | |
675 tty->print_cr(" ndebug() - undo debug"); | |
676 } | |
677 | |
4006 | 678 #endif // !PRODUCT |