annotate src/share/vm/utilities/debug.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 126ea7725993
children 30f67acf635d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
2 * Copyright (c) 1997, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_debug.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
29 # ifdef _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // NOTE: don't turn the lines below into a comment -- if you're getting
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // a compile error here, change the settings to define ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
32 ASSERT should be defined when _DEBUG is defined. It is not intended to be used for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
33 functions that do not slow down the system too much and thus can be left in optimized code.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 On the other hand, the code should not be included in a production version.
a61af66fc99e Initial load
duke
parents:
diff changeset
35 # endif // _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
36 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 #ifdef _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
40 # ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
41 configuration error: ASSERT must be defined in debug version
a61af66fc99e Initial load
duke
parents:
diff changeset
42 # endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
43 #endif // _DEBUG
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
47 # if -defined _DEBUG || -defined ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
48 configuration error: ASSERT et al. must not be defined in PRODUCT version
a61af66fc99e Initial load
duke
parents:
diff changeset
49 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void warning(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // In case error happens before init or during shutdown
a61af66fc99e Initial load
duke
parents:
diff changeset
55 if (tty == NULL) ostream_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 tty->print("%s warning: ", VM_Version::vm_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
58 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 if (BreakAtWarning) BREAKPOINT;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 #define is_token_break(ch) (isspace(ch) || (ch) == ',')
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 static const char* last_file_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static int last_line_no = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // assert/guarantee/... may happen very early during VM initialization.
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Don't rely on anything that is initialized by Threads::create_vm(). For
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // example, don't use tty.
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
75 bool error_is_suppressed(const char* file_name, int line_no) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // The following 1-element cache requires that passed-in
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // file names are always only constant literals.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 if (file_name == last_file_name && line_no == last_line_no) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 int file_name_len = (int)strlen(file_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 char separator = os::file_separator()[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
82 const char* base_name = strrchr(file_name, separator);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 if (base_name == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
84 base_name = file_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // scan the SuppressErrorAt option
a61af66fc99e Initial load
duke
parents:
diff changeset
87 const char* cp = SuppressErrorAt;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 const char* sfile;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 int sfile_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 int sline;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 bool noisy;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 while ((*cp) != '\0' && is_token_break(*cp)) cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 if ((*cp) == '\0') break;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 sfile = cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 while ((*cp) != '\0' && !is_token_break(*cp) && (*cp) != ':') cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 sfile_len = cp - sfile;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if ((*cp) == ':') cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 sline = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 while ((*cp) != '\0' && isdigit(*cp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 sline *= 10;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 sline += (*cp) - '0';
a61af66fc99e Initial load
duke
parents:
diff changeset
103 cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // "file:line!" means the assert suppression is not silent
a61af66fc99e Initial load
duke
parents:
diff changeset
106 noisy = ((*cp) == '!');
a61af66fc99e Initial load
duke
parents:
diff changeset
107 while ((*cp) != '\0' && !is_token_break(*cp)) cp++;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // match the line
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (sline != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 if (sline != line_no) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // match the file
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (sfile_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 const char* look = file_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 const char* look_max = file_name + file_name_len - sfile_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 const char* foundp;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool match = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 while (!match
a61af66fc99e Initial load
duke
parents:
diff changeset
119 && (foundp = strchr(look, sfile[0])) != NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
120 && foundp <= look_max) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 match = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 for (int i = 1; i < sfile_len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 if (sfile[i] != foundp[i]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 match = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 look = foundp + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 if (!match) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // got a match!
a61af66fc99e Initial load
duke
parents:
diff changeset
133 if (noisy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 fdStream out(defaultStream::output_fd());
a61af66fc99e Initial load
duke
parents:
diff changeset
135 out.print_raw("[error suppressed at ");
a61af66fc99e Initial load
duke
parents:
diff changeset
136 out.print_raw(base_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 char buf[16];
a61af66fc99e Initial load
duke
parents:
diff changeset
138 jio_snprintf(buf, sizeof(buf), ":%d]", line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 out.print_raw_cr(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // update 1-element cache for fast silent matches
a61af66fc99e Initial load
duke
parents:
diff changeset
142 last_file_name = file_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 last_line_no = line_no;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 if (!is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // print a friendly hint:
a61af66fc99e Initial load
duke
parents:
diff changeset
150 fdStream out(defaultStream::output_fd());
a61af66fc99e Initial load
duke
parents:
diff changeset
151 out.print_raw_cr("# To suppress the following error report, specify this argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 out.print_raw ("# after -XX: or in .hotspotrc: SuppressErrorAt=");
a61af66fc99e Initial load
duke
parents:
diff changeset
153 out.print_raw (base_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 char buf[16];
a61af66fc99e Initial load
duke
parents:
diff changeset
155 jio_snprintf(buf, sizeof(buf), ":%d", line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 out.print_raw_cr(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 #undef is_token_break
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Place-holder for non-existent suppression check:
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
166 #define error_is_suppressed(file_name, line_no) (false)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
169
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
170 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
171 const char* detail_msg)
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
172 {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
173 if (Debugging || error_is_suppressed(file, line)) return;
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
174 Thread* const thread = ThreadLocalStorage::get_thread_slow();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
175 VMError err(thread, file, line, error_msg, detail_msg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
179 void report_fatal(const char* file, int line, const char* message)
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
180 {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
181 report_vm_error(file, line, "fatal error", message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Used by report_vm_out_of_memory to detect recursion.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 static jint _exiting_out_of_mem = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
186
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
187 void report_vm_out_of_memory(const char* file, int line, size_t size,
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
188 const char* message) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
189 if (Debugging || error_is_suppressed(file, line)) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // We try to gather additional information for the first out of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // error only; gathering additional data might cause an allocation and a
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // recursive out_of_memory condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 const jint exiting = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // If we succeed in changing the value, we're the first one in.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 bool first_time_here = Atomic::xchg(exiting, &_exiting_out_of_mem) != exiting;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 if (first_time_here) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 Thread* thread = ThreadLocalStorage::get_thread_slow();
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
201 VMError(thread, file, line, size, message).report_and_die();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
203
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
204 // Dump core and abort
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
205 vm_abort(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
208 void report_should_not_call(const char* file, int line) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
209 report_vm_error(file, line, "ShouldNotCall()");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
212 void report_should_not_reach_here(const char* file, int line) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
213 report_vm_error(file, line, "ShouldNotReachHere()");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
216 void report_unimplemented(const char* file, int line) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
217 report_vm_error(file, line, "Unimplemented()");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
220 void report_untested(const char* file, int line, const char* message) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221 #ifndef PRODUCT
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
222 warning("Untested: %s in %s: %d\n", message, file, line);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void report_java_out_of_memory(const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 static jint out_of_memory_reported = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // A number of threads may attempt to report OutOfMemoryError at around the
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // same time. To avoid dumping the heap or executing the data collection
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // commands multiple times we just do it once when the first threads reports
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // the error.
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // create heap dump before OnOutOfMemoryError commands are executed
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (HeapDumpOnOutOfMemoryError) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 tty->print_cr("java.lang.OutOfMemoryError: %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 HeapDumper::dump_heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 VMError err(message);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 err.report_java_out_of_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 extern "C" void ps();
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 static bool error_reported = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // call this when the VM is dying--it might loosen some asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void set_error_reported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 error_reported = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 bool is_error_reported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return error_reported;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
261 #ifndef PRODUCT
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
262 #include <signal.h>
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
263
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
264 void test_error_handler(size_t test_num)
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
265 {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
266 if (test_num == 0) return;
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
267
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
268 // If asserts are disabled, use the corresponding guarantee instead.
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
269 size_t n = test_num;
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
270 NOT_DEBUG(if (n <= 2) n += 2);
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
271
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
272 const char* const str = "hello";
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
273 const size_t num = (size_t)os::vm_page_size();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
274
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
275 const char* const eol = os::line_separator();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
276 const char* const msg = "this message should be truncated during formatting";
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
277
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
278 // Keep this in sync with test/runtime/6888954/vmerrors.sh.
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
279 switch (n) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
280 case 1: assert(str == NULL, "expected null");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
281 case 2: assert(num == 1023 && *str == 'X',
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
282 err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str));
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
283 case 3: guarantee(str == NULL, "expected null");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
284 case 4: guarantee(num == 1023 && *str == 'X',
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
285 err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str));
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
286 case 5: fatal("expected null");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
287 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
288 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
289 "%s%s# %s%s# %s%s# %s%s# %s%s# "
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
290 "%s%s# %s%s# %s%s# %s%s# %s",
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
291 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol,
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
292 msg, eol, msg, eol, msg, eol, msg, eol, msg, eol,
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
293 msg, eol, msg, eol, msg, eol, msg, eol, msg));
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
294 case 8: vm_exit_out_of_memory(num, "ChunkPool::allocate");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
295 case 9: ShouldNotCallThis();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
296 case 10: ShouldNotReachHere();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
297 case 11: Unimplemented();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
298 // This is last because it does not generate an hs_err* file on Windows.
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
299 case 12: os::signal_raise(SIGSEGV);
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
300
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
301 default: ShouldNotReachHere();
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
302 }
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
303 }
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
304 #endif // #ifndef PRODUCT
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 989
diff changeset
305
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // ------ helper functions for debugging go here ------------
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // All debug entries should be wrapped with a stack allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // Command object. It makes sure a resource mark is set and
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // flushes the logfile to prevent file sharing problems.
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 class Command : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
315 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 ResetNoHandleMark rnhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 bool debug_save;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
320 static int level;
a61af66fc99e Initial load
duke
parents:
diff changeset
321 Command(const char* str) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 debug_save = Debugging;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 Debugging = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 if (level++ > 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
326 tty->print_cr("\"Executing %s\"", str);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 ~Command() { tty->flush(); Debugging = debug_save; level--; }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 };
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 int Command::level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 extern "C" void blob(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 Command c("blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
336 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 extern "C" void dump_vtable(address p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 Command c("dump_vtable");
a61af66fc99e Initial load
duke
parents:
diff changeset
342 klassOop k = (klassOop)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 instanceKlass::cast(k)->vtable()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 extern "C" void nm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // Actually we look through all CodeBlobs (the nm name has been kept for backwards compatability)
a61af66fc99e Initial load
duke
parents:
diff changeset
349 Command c("nm");
a61af66fc99e Initial load
duke
parents:
diff changeset
350 CodeBlob* cb = CodeCache::find_blob((address)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 if (cb == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 tty->print_cr("NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
353 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 extern "C" void disnm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 Command c("disnm");
a61af66fc99e Initial load
duke
parents:
diff changeset
361 CodeBlob* cb = CodeCache::find_blob((address) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 Disassembler::decode(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366
a61af66fc99e Initial load
duke
parents:
diff changeset
367 extern "C" void printnm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
369 sprintf(buffer, "printnm: " INTPTR_FORMAT, p);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 Command c(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 CodeBlob* cb = CodeCache::find_blob((address) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
374 nm->print_nmethod(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 extern "C" void universe() {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 Command c("universe");
a61af66fc99e Initial load
duke
parents:
diff changeset
381 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 extern "C" void verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // try to run a verify on the entire system
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // note: this may not be safe if we're not at a safepoint; for debugging,
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // this manipulates the safepoint settings to avoid assertion failures
a61af66fc99e Initial load
duke
parents:
diff changeset
389 Command c("universe verify");
a61af66fc99e Initial load
duke
parents:
diff changeset
390 bool safe = SafepointSynchronize::is_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (!safe) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 tty->print_cr("warning: not at safepoint -- verify may fail");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 SafepointSynchronize::set_is_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // Ensure Eden top is correct before verification
a61af66fc99e Initial load
duke
parents:
diff changeset
396 Universe::heap()->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 Universe::verify(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (!safe) SafepointSynchronize::set_is_not_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 extern "C" void pp(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 Command c("pp");
a61af66fc99e Initial load
duke
parents:
diff changeset
404 FlagSetting fl(PrintVMMessages, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (Universe::heap()->is_in(p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 oop obj = oop(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
407 obj->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
408 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 tty->print("%#p", p);
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // pv: print vm-printable object
a61af66fc99e Initial load
duke
parents:
diff changeset
415 extern "C" void pa(intptr_t p) { ((AllocatedObj*) p)->print(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
416 extern "C" void findpc(intptr_t x);
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 extern "C" void ps() { // print stack
a61af66fc99e Initial load
duke
parents:
diff changeset
419 Command c("ps");
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Prints the stack of the current Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
423 JavaThread* p = JavaThread::active();
a61af66fc99e Initial load
duke
parents:
diff changeset
424 tty->print(" for thread: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
425 p->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
426 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 if (p->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // If the last_Java_fp is set we are in C land and
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // can call the standard stack_trace function.
a61af66fc99e Initial load
duke
parents:
diff changeset
431 p->trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
432 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 frame f = os::current_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
434 RegisterMap reg_map(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 f = f.sender(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 tty->print("(guessing starting frame id=%#p based on current fp)\n", f.id());
a61af66fc99e Initial load
duke
parents:
diff changeset
437 p->trace_stack_from(vframe::new_vframe(&f, &reg_map, p));
a61af66fc99e Initial load
duke
parents:
diff changeset
438 pd_ps(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 extern "C" void psf() { // print stack frames
a61af66fc99e Initial load
duke
parents:
diff changeset
445 {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 Command c("psf");
a61af66fc99e Initial load
duke
parents:
diff changeset
447 JavaThread* p = JavaThread::active();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 tty->print(" for thread: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
449 p->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
450 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (p->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 p->trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 extern "C" void threads() {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 Command c("threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
460 Threads::print(false, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 extern "C" void psd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 Command c("psd");
a61af66fc99e Initial load
duke
parents:
diff changeset
466 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 extern "C" void safepoints() {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 Command c("safepoints");
a61af66fc99e Initial load
duke
parents:
diff changeset
472 SafepointSynchronize::print_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 extern "C" void pss() { // print all stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
477 Command c("pss");
a61af66fc99e Initial load
duke
parents:
diff changeset
478 Threads::print(true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 extern "C" void debug() { // to set things up for compiler debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
483 Command c("debug");
a61af66fc99e Initial load
duke
parents:
diff changeset
484 WizardMode = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 PrintVMMessages = PrintCompilation = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 PrintInlining = PrintAssembly = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 extern "C" void ndebug() { // undo debug()
a61af66fc99e Initial load
duke
parents:
diff changeset
492 Command c("ndebug");
a61af66fc99e Initial load
duke
parents:
diff changeset
493 PrintCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 PrintInlining = PrintAssembly = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 extern "C" void flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
500 Command c("flush");
a61af66fc99e Initial load
duke
parents:
diff changeset
501 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 extern "C" void events() {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 Command c("events");
a61af66fc99e Initial load
duke
parents:
diff changeset
507 Events::print_last(tty, 50);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 extern "C" void nevents(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 Command c("events");
a61af66fc99e Initial load
duke
parents:
diff changeset
513 Events::print_last(tty, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Given a heap address that was valid before the most recent GC, if
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // the oop that used to contain it is still live, prints the new
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // location of the oop and the address. Useful for tracking down
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // certain kinds of naked oop and oop map bugs.
a61af66fc99e Initial load
duke
parents:
diff changeset
521 extern "C" void pnl(intptr_t old_heap_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // Print New Location of old heap address
a61af66fc99e Initial load
duke
parents:
diff changeset
523 Command c("pnl");
a61af66fc99e Initial load
duke
parents:
diff changeset
524 #ifndef VALIDATE_MARK_SWEEP
a61af66fc99e Initial load
duke
parents:
diff changeset
525 tty->print_cr("Requires build with VALIDATE_MARK_SWEEP defined (debug build) and RecordMarkSweepCompaction enabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
526 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
527 MarkSweep::print_new_location_of_heap_address((HeapWord*) old_heap_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 extern "C" methodOop findm(intptr_t pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 Command c("findm");
a61af66fc99e Initial load
duke
parents:
diff changeset
534 nmethod* nm = CodeCache::find_nmethod((address)pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 return (nm == NULL) ? (methodOop)NULL : nm->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 extern "C" nmethod* findnm(intptr_t addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 Command c("findnm");
a61af66fc99e Initial load
duke
parents:
diff changeset
541 return CodeCache::find_nmethod((address)addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 static address same_page(address x, address y) {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 intptr_t page_bits = -os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 return x;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 } else if (x > y) {
a61af66fc99e Initial load
duke
parents:
diff changeset
549 return (address)(intptr_t(y) | ~page_bits) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 return (address)(intptr_t(y) & page_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 class LookForRefInGenClosure : public OopsInGenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
557 oop target;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 void do_oop(oop* o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
559 if (o != NULL && *o == target) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
560 tty->print_cr(INTPTR_FORMAT, o);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
563 void do_oop(narrowOop* o) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564 };
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 class LookForRefInObjectClosure : public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
569 LookForRefInGenClosure look_in_object;
a61af66fc99e Initial load
duke
parents:
diff changeset
570 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
571 LookForRefInObjectClosure(oop target) { look_in_object.target = target; }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
573 obj->oop_iterate(&look_in_object);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
578 static void findref(intptr_t x) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
579 CollectedHeap *ch = Universe::heap();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 LookForRefInGenClosure lookFor;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 lookFor.target = (oop) x;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 LookForRefInObjectClosure look_in_object((oop) x);
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 tty->print_cr("Searching heap:");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
585 ch->object_iterate(&look_in_object);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 tty->print_cr("Searching strong roots:");
a61af66fc99e Initial load
duke
parents:
diff changeset
588 Universe::oops_do(&lookFor, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 JNIHandles::oops_do(&lookFor); // Global (strong) JNI handles
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 432
diff changeset
590 Threads::oops_do(&lookFor, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 ObjectSynchronizer::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 //FlatProfiler::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 SystemDictionary::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 432
diff changeset
595 tty->print_cr("Searching code cache:");
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 432
diff changeset
596 CodeCache::oops_do(&lookFor);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 432
diff changeset
597
0
a61af66fc99e Initial load
duke
parents:
diff changeset
598 tty->print_cr("Done.");
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 class FindClassObjectClosure: public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
603 const char* _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
604 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
605 FindClassObjectClosure(const char name[]) { _target = name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 virtual void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 if (obj->is_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 Klass* k = klassOop(obj)->klass_part();
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (k->name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
612 const char* ext = k->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if ( strcmp(_target, ext) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 tty->print_cr("Found " INTPTR_FORMAT, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 obj->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620 };
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 //
a61af66fc99e Initial load
duke
parents:
diff changeset
623 extern "C" void findclass(const char name[]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 Command c("findclass");
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 tty->print_cr("Finding class %s -> ", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
627 FindClassObjectClosure srch(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
628 Universe::heap()->permanent_object_iterate(&srch);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // Another interface that isn't ambiguous in dbx.
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // Can we someday rename the other find to hsfind?
a61af66fc99e Initial load
duke
parents:
diff changeset
634 extern "C" void hsfind(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 Command c("hsfind");
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
636 os::print_location(tty, x, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 extern "C" void hsfindref(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
641 Command c("hsfindref");
a61af66fc99e Initial load
duke
parents:
diff changeset
642 findref(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 extern "C" void find(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 Command c("find");
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
647 os::print_location(tty, x, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 extern "C" void findpc(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 Command c("findpc");
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
653 os::print_location(tty, x, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // int versions of all methods to avoid having to type type casts in the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 void pp(intptr_t p) { pp((void*)p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 void pp(oop p) { pp((void*)p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 void help() {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 Command c("help");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 tty->print_cr("basic");
a61af66fc99e Initial load
duke
parents:
diff changeset
665 tty->print_cr(" pp(void* p) - try to make sense of p");
a61af66fc99e Initial load
duke
parents:
diff changeset
666 tty->print_cr(" pv(intptr_t p)- ((PrintableResourceObj*) p)->print()");
a61af66fc99e Initial load
duke
parents:
diff changeset
667 tty->print_cr(" ps() - print current thread stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
668 tty->print_cr(" pss() - print all thread stacks");
a61af66fc99e Initial load
duke
parents:
diff changeset
669 tty->print_cr(" pm(int pc) - print methodOop given compiled PC");
a61af66fc99e Initial load
duke
parents:
diff changeset
670 tty->print_cr(" findm(intptr_t pc) - finds methodOop");
a61af66fc99e Initial load
duke
parents:
diff changeset
671 tty->print_cr(" find(intptr_t x) - finds & prints nmethod/stub/bytecode/oop based on pointer into it");
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 tty->print_cr("misc.");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 tty->print_cr(" flush() - flushes the log file");
a61af66fc99e Initial load
duke
parents:
diff changeset
675 tty->print_cr(" events() - dump last 50 events");
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 tty->print_cr("compiler debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
679 tty->print_cr(" debug() - to set things up for compiler debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
680 tty->print_cr(" ndebug() - undo debug");
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // BobV's command parser for debugging on windows when nothing else works.
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687 enum CommandID {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 CMDID_HELP,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 CMDID_QUIT,
a61af66fc99e Initial load
duke
parents:
diff changeset
690 CMDID_HSFIND,
a61af66fc99e Initial load
duke
parents:
diff changeset
691 CMDID_PSS,
a61af66fc99e Initial load
duke
parents:
diff changeset
692 CMDID_PS,
a61af66fc99e Initial load
duke
parents:
diff changeset
693 CMDID_PSF,
a61af66fc99e Initial load
duke
parents:
diff changeset
694 CMDID_FINDM,
a61af66fc99e Initial load
duke
parents:
diff changeset
695 CMDID_FINDNM,
a61af66fc99e Initial load
duke
parents:
diff changeset
696 CMDID_PP,
a61af66fc99e Initial load
duke
parents:
diff changeset
697 CMDID_BPT,
a61af66fc99e Initial load
duke
parents:
diff changeset
698 CMDID_EXIT,
a61af66fc99e Initial load
duke
parents:
diff changeset
699 CMDID_VERIFY,
a61af66fc99e Initial load
duke
parents:
diff changeset
700 CMDID_THREADS,
a61af66fc99e Initial load
duke
parents:
diff changeset
701 CMDID_ILLEGAL = 99
a61af66fc99e Initial load
duke
parents:
diff changeset
702 };
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 struct CommandParser {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 CommandID code;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 char *description;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 };
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 struct CommandParser CommandList[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 (char *)"help", CMDID_HELP, " Dump this list",
a61af66fc99e Initial load
duke
parents:
diff changeset
712 (char *)"quit", CMDID_QUIT, " Return from this routine",
a61af66fc99e Initial load
duke
parents:
diff changeset
713 (char *)"hsfind", CMDID_HSFIND, "Perform an hsfind on an address",
a61af66fc99e Initial load
duke
parents:
diff changeset
714 (char *)"ps", CMDID_PS, " Print Current Thread Stack Trace",
a61af66fc99e Initial load
duke
parents:
diff changeset
715 (char *)"pss", CMDID_PSS, " Print All Thread Stack Trace",
a61af66fc99e Initial load
duke
parents:
diff changeset
716 (char *)"psf", CMDID_PSF, " Print All Stack Frames",
a61af66fc99e Initial load
duke
parents:
diff changeset
717 (char *)"findm", CMDID_FINDM, " Find a methodOop from a PC",
a61af66fc99e Initial load
duke
parents:
diff changeset
718 (char *)"findnm", CMDID_FINDNM, "Find an nmethod from a PC",
a61af66fc99e Initial load
duke
parents:
diff changeset
719 (char *)"pp", CMDID_PP, " Find out something about a pointer",
a61af66fc99e Initial load
duke
parents:
diff changeset
720 (char *)"break", CMDID_BPT, " Execute a breakpoint",
a61af66fc99e Initial load
duke
parents:
diff changeset
721 (char *)"exitvm", CMDID_EXIT, "Exit the VM",
a61af66fc99e Initial load
duke
parents:
diff changeset
722 (char *)"verify", CMDID_VERIFY, "Perform a Heap Verify",
a61af66fc99e Initial load
duke
parents:
diff changeset
723 (char *)"thread", CMDID_THREADS, "Dump Info on all Threads",
a61af66fc99e Initial load
duke
parents:
diff changeset
724 (char *)0, CMDID_ILLEGAL
a61af66fc99e Initial load
duke
parents:
diff changeset
725 };
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // get_debug_command()
a61af66fc99e Initial load
duke
parents:
diff changeset
729 //
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // Read a command from standard input.
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // This is useful when you have a debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // which doesn't support calling into functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
733 //
a61af66fc99e Initial load
duke
parents:
diff changeset
734 void get_debug_command()
a61af66fc99e Initial load
duke
parents:
diff changeset
735 {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 ssize_t count;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 int i,j;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 bool gotcommand;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 intptr_t addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
741 nmethod *nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
742 methodOop m;
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 tty->print_cr("You have entered the diagnostic command interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
745 tty->print("The supported commands are:\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
746 for ( i=0; ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 if ( CommandList[i].code == CMDID_ILLEGAL )
a61af66fc99e Initial load
duke
parents:
diff changeset
748 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 tty->print_cr(" %s \n", CommandList[i].name );
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 gotcommand = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 tty->print("Please enter a command: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
755 count = scanf("%s", buffer) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
756 if ( count >=0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 for ( i=0; ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if ( CommandList[i].code == CMDID_ILLEGAL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (!gotcommand) tty->print("Invalid command, please try again\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
760 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762 if ( strcmp(buffer, CommandList[i].name) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 gotcommand = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
764 switch ( CommandList[i].code ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 case CMDID_PS:
a61af66fc99e Initial load
duke
parents:
diff changeset
766 ps();
a61af66fc99e Initial load
duke
parents:
diff changeset
767 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 case CMDID_PSS:
a61af66fc99e Initial load
duke
parents:
diff changeset
769 pss();
a61af66fc99e Initial load
duke
parents:
diff changeset
770 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 case CMDID_PSF:
a61af66fc99e Initial load
duke
parents:
diff changeset
772 psf();
a61af66fc99e Initial load
duke
parents:
diff changeset
773 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 case CMDID_FINDM:
a61af66fc99e Initial load
duke
parents:
diff changeset
775 tty->print("Please enter the hex addr to pass to findm: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
776 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 m = (methodOop)findm(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 tty->print("findm(0x%I64X) returned 0x%I64X\n", addr, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 case CMDID_FINDNM:
a61af66fc99e Initial load
duke
parents:
diff changeset
781 tty->print("Please enter the hex addr to pass to findnm: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
782 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 nm = (nmethod*)findnm(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
784 tty->print("findnm(0x%I64X) returned 0x%I64X\n", addr, nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
785 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 case CMDID_PP:
a61af66fc99e Initial load
duke
parents:
diff changeset
787 tty->print("Please enter the hex addr to pass to pp: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
788 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 pp((void*)addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
790 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
791 case CMDID_EXIT:
a61af66fc99e Initial load
duke
parents:
diff changeset
792 exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 case CMDID_HELP:
a61af66fc99e Initial load
duke
parents:
diff changeset
794 tty->print("Here are the supported commands: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
795 for ( j=0; ; j++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
796 if ( CommandList[j].code == CMDID_ILLEGAL )
a61af66fc99e Initial load
duke
parents:
diff changeset
797 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 tty->print_cr(" %s -- %s\n", CommandList[j].name,
a61af66fc99e Initial load
duke
parents:
diff changeset
799 CommandList[j].description );
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
802 case CMDID_QUIT:
a61af66fc99e Initial load
duke
parents:
diff changeset
803 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
804 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 case CMDID_BPT:
a61af66fc99e Initial load
duke
parents:
diff changeset
806 BREAKPOINT;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 case CMDID_VERIFY:
a61af66fc99e Initial load
duke
parents:
diff changeset
809 verify();;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 case CMDID_THREADS:
a61af66fc99e Initial load
duke
parents:
diff changeset
812 threads();;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 case CMDID_HSFIND:
a61af66fc99e Initial load
duke
parents:
diff changeset
815 tty->print("Please enter the hex addr to pass to hsfind: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
816 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
817 tty->print("Calling hsfind(0x%I64X)\n", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
818 hsfind(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
819 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
820 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
821 case CMDID_ILLEGAL:
a61af66fc99e Initial load
duke
parents:
diff changeset
822 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 #endif // PRODUCT