annotate src/share/vm/utilities/debug.cpp @ 453:c96030fff130

6684579: SoftReference processing can be made more efficient Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not. Reviewed-by: jmasa
author ysr
date Thu, 20 Nov 2008 16:56:09 -0800
parents 275a3b7ff0d6
children 148e5441d916
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 1997-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 bool assert_is_suppressed(const char* file_name, int line_no) {
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:
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #define assert_is_suppressed(file_name, line_no) (false)
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
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void report_assertion_failure(const char* file_name, int line_no, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 VMError err(ThreadLocalStorage::get_thread_slow(), message, file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void report_fatal(const char* file_name, int line_no, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 VMError err(ThreadLocalStorage::get_thread_slow(), message, file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void report_fatal_vararg(const char* file_name, int line_no, const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
184 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 jio_vsnprintf(buffer, sizeof(buffer), format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 report_fatal(file_name, line_no, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Used by report_vm_out_of_memory to detect recursion.
a61af66fc99e Initial load
duke
parents:
diff changeset
193 static jint _exiting_out_of_mem = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Just passing the flow to VMError to handle error
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void report_vm_out_of_memory(const char* file_name, int line_no, size_t size, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // We try to gather additional information for the first out of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // error only; gathering additional data might cause an allocation and a
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // recursive out_of_memory condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 const jint exiting = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // If we succeed in changing the value, we're the first one in.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 bool first_time_here = Atomic::xchg(exiting, &_exiting_out_of_mem) != exiting;
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (first_time_here) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 Thread* thread = ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 VMError(thread, size, message, file_name, line_no).report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
211
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
212 // Dump core and abort
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
213 vm_abort(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void report_vm_out_of_memory_vararg(const char* file_name, int line_no, size_t size, const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
218 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 jio_vsnprintf(buffer, sizeof(buffer), format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 report_vm_out_of_memory(file_name, line_no, size, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 void report_should_not_call(const char* file_name, int line_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 VMError err(ThreadLocalStorage::get_thread_slow(), "ShouldNotCall()", file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void report_should_not_reach_here(const char* file_name, int line_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 VMError err(ThreadLocalStorage::get_thread_slow(), "ShouldNotReachHere()", file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 err.report_and_die();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void report_unimplemented(const char* file_name, int line_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 if (Debugging || assert_is_suppressed(file_name, line_no)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 VMError err(ThreadLocalStorage::get_thread_slow(), "Unimplemented()", file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 err.report_and_die();
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 void report_untested(const char* file_name, int line_no, const char* msg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
248 warning("Untested: %s in %s: %d\n", msg, file_name, line_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void report_java_out_of_memory(const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 static jint out_of_memory_reported = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // A number of threads may attempt to report OutOfMemoryError at around the
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // same time. To avoid dumping the heap or executing the data collection
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // commands multiple times we just do it once when the first threads reports
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // the error.
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // create heap dump before OnOutOfMemoryError commands are executed
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if (HeapDumpOnOutOfMemoryError) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 tty->print_cr("java.lang.OutOfMemoryError: %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 HeapDumper::dump_heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 VMError err(message);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 err.report_java_out_of_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 extern "C" void ps();
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 static bool error_reported = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // call this when the VM is dying--it might loosen some asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void set_error_reported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 error_reported = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 bool is_error_reported() {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return error_reported;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // ------ helper functions for debugging go here ------------
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // All debug entries should be wrapped with a stack allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Command object. It makes sure a resource mark is set and
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // flushes the logfile to prevent file sharing problems.
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 class Command : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
296 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 ResetNoHandleMark rnhm;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool debug_save;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
301 static int level;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Command(const char* str) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 debug_save = Debugging;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 Debugging = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if (level++ > 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 tty->print_cr("\"Executing %s\"", str);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 ~Command() { tty->flush(); Debugging = debug_save; level--; }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 };
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 int Command::level = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 extern "C" void blob(CodeBlob* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 Command c("blob");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 extern "C" void dump_vtable(address p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 Command c("dump_vtable");
a61af66fc99e Initial load
duke
parents:
diff changeset
323 klassOop k = (klassOop)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 instanceKlass::cast(k)->vtable()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 extern "C" void nm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Actually we look through all CodeBlobs (the nm name has been kept for backwards compatability)
a61af66fc99e Initial load
duke
parents:
diff changeset
330 Command c("nm");
a61af66fc99e Initial load
duke
parents:
diff changeset
331 CodeBlob* cb = CodeCache::find_blob((address)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
332 if (cb == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 tty->print_cr("NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
334 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
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 disnm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 Command c("disnm");
a61af66fc99e Initial load
duke
parents:
diff changeset
342 CodeBlob* cb = CodeCache::find_blob((address) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
344 Disassembler::decode(cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 extern "C" void printnm(intptr_t p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
350 sprintf(buffer, "printnm: " INTPTR_FORMAT, p);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 Command c(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 CodeBlob* cb = CodeCache::find_blob((address) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (cb->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 nm->print_nmethod(true);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
360 extern "C" void universe() {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 Command c("universe");
a61af66fc99e Initial load
duke
parents:
diff changeset
362 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 extern "C" void verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // try to run a verify on the entire system
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // note: this may not be safe if we're not at a safepoint; for debugging,
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // this manipulates the safepoint settings to avoid assertion failures
a61af66fc99e Initial load
duke
parents:
diff changeset
370 Command c("universe verify");
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool safe = SafepointSynchronize::is_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 if (!safe) {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 tty->print_cr("warning: not at safepoint -- verify may fail");
a61af66fc99e Initial load
duke
parents:
diff changeset
374 SafepointSynchronize::set_is_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Ensure Eden top is correct before verification
a61af66fc99e Initial load
duke
parents:
diff changeset
377 Universe::heap()->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 Universe::verify(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 if (!safe) SafepointSynchronize::set_is_not_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 extern "C" void pp(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 Command c("pp");
a61af66fc99e Initial load
duke
parents:
diff changeset
385 FlagSetting fl(PrintVMMessages, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 if (Universe::heap()->is_in(p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 oop obj = oop(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 obj->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 tty->print("%#p", p);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // pv: print vm-printable object
a61af66fc99e Initial load
duke
parents:
diff changeset
396 extern "C" void pa(intptr_t p) { ((AllocatedObj*) p)->print(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 extern "C" void findpc(intptr_t x);
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 extern "C" void ps() { // print stack
a61af66fc99e Initial load
duke
parents:
diff changeset
400 Command c("ps");
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // Prints the stack of the current Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
404 JavaThread* p = JavaThread::active();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 tty->print(" for thread: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
406 p->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
407 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 if (p->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // If the last_Java_fp is set we are in C land and
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // can call the standard stack_trace function.
a61af66fc99e Initial load
duke
parents:
diff changeset
412 p->trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
413 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 frame f = os::current_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
415 RegisterMap reg_map(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 f = f.sender(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 tty->print("(guessing starting frame id=%#p based on current fp)\n", f.id());
a61af66fc99e Initial load
duke
parents:
diff changeset
418 p->trace_stack_from(vframe::new_vframe(&f, &reg_map, p));
a61af66fc99e Initial load
duke
parents:
diff changeset
419 pd_ps(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 extern "C" void psf() { // print stack frames
a61af66fc99e Initial load
duke
parents:
diff changeset
426 {
a61af66fc99e Initial load
duke
parents:
diff changeset
427 Command c("psf");
a61af66fc99e Initial load
duke
parents:
diff changeset
428 JavaThread* p = JavaThread::active();
a61af66fc99e Initial load
duke
parents:
diff changeset
429 tty->print(" for thread: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
430 p->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
432 if (p->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 p->trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438
a61af66fc99e Initial load
duke
parents:
diff changeset
439 extern "C" void threads() {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 Command c("threads");
a61af66fc99e Initial load
duke
parents:
diff changeset
441 Threads::print(false, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 extern "C" void psd() {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 Command c("psd");
a61af66fc99e Initial load
duke
parents:
diff changeset
447 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 extern "C" void safepoints() {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 Command c("safepoints");
a61af66fc99e Initial load
duke
parents:
diff changeset
453 SafepointSynchronize::print_state();
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 extern "C" void pss() { // print all stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
458 Command c("pss");
a61af66fc99e Initial load
duke
parents:
diff changeset
459 Threads::print(true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 extern "C" void debug() { // to set things up for compiler debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
464 Command c("debug");
a61af66fc99e Initial load
duke
parents:
diff changeset
465 WizardMode = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 PrintVMMessages = PrintCompilation = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 PrintInlining = PrintAssembly = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
468 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 extern "C" void ndebug() { // undo debug()
a61af66fc99e Initial load
duke
parents:
diff changeset
473 Command c("ndebug");
a61af66fc99e Initial load
duke
parents:
diff changeset
474 PrintCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 PrintInlining = PrintAssembly = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 extern "C" void flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 Command c("flush");
a61af66fc99e Initial load
duke
parents:
diff changeset
482 tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 extern "C" void events() {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 Command c("events");
a61af66fc99e Initial load
duke
parents:
diff changeset
488 Events::print_last(tty, 50);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 extern "C" void nevents(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 Command c("events");
a61af66fc99e Initial load
duke
parents:
diff changeset
494 Events::print_last(tty, n);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // Given a heap address that was valid before the most recent GC, if
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // the oop that used to contain it is still live, prints the new
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // location of the oop and the address. Useful for tracking down
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // certain kinds of naked oop and oop map bugs.
a61af66fc99e Initial load
duke
parents:
diff changeset
502 extern "C" void pnl(intptr_t old_heap_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // Print New Location of old heap address
a61af66fc99e Initial load
duke
parents:
diff changeset
504 Command c("pnl");
a61af66fc99e Initial load
duke
parents:
diff changeset
505 #ifndef VALIDATE_MARK_SWEEP
a61af66fc99e Initial load
duke
parents:
diff changeset
506 tty->print_cr("Requires build with VALIDATE_MARK_SWEEP defined (debug build) and RecordMarkSweepCompaction enabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
507 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
508 MarkSweep::print_new_location_of_heap_address((HeapWord*) old_heap_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 extern "C" methodOop findm(intptr_t pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 Command c("findm");
a61af66fc99e Initial load
duke
parents:
diff changeset
515 nmethod* nm = CodeCache::find_nmethod((address)pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 return (nm == NULL) ? (methodOop)NULL : nm->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 extern "C" nmethod* findnm(intptr_t addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 Command c("findnm");
a61af66fc99e Initial load
duke
parents:
diff changeset
522 return CodeCache::find_nmethod((address)addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 static address same_page(address x, address y) {
a61af66fc99e Initial load
duke
parents:
diff changeset
526 intptr_t page_bits = -os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 return x;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 } else if (x > y) {
a61af66fc99e Initial load
duke
parents:
diff changeset
530 return (address)(intptr_t(y) | ~page_bits) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 return (address)(intptr_t(y) & page_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 static void find(intptr_t x, bool print_pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 address addr = (address)x;
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 CodeBlob* b = CodeCache::find_blob_unsafe(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (b != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 if (b->is_buffer_blob()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // the interpreter is generated into a buffer blob
a61af66fc99e Initial load
duke
parents:
diff changeset
544 InterpreterCodelet* i = Interpreter::codelet_containing(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (i != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 i->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
547 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 if (Interpreter::contains(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 tty->print_cr(INTPTR_FORMAT " is pointing into interpreter code (not bytecode specific)", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 //
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (AdapterHandlerLibrary::contains(b)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 AdapterHandlerLibrary::print_handler(b);
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // the stubroutines are generated into a buffer blob
a61af66fc99e Initial load
duke
parents:
diff changeset
558 StubCodeDesc* d = StubCodeDesc::desc_for(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 if (d != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 d->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
561 if (print_pc) tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
562 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 if (StubRoutines::contains(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
565 tty->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
566 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // the InlineCacheBuffer is using stubs generated into a buffer blob
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (InlineCacheBuffer::contains(addr)) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
570 tty->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573 VtableStub* v = VtableStubs::stub_containing(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 if (v != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
575 v->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
576 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (print_pc && b->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 tty->print("%#p: Compiled ", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 ((nmethod*)b)->method()->print_value_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 tty->print(" = (CodeBlob*)" INTPTR_FORMAT, b);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if ( b->is_nmethod()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 if (b->is_zombie()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 tty->print_cr(INTPTR_FORMAT " is zombie nmethod", b);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 } else if (b->is_not_entrant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 tty->print_cr(INTPTR_FORMAT " is non-entrant nmethod", b);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 b->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
595 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
598 if (Universe::heap()->is_in(addr)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 HeapWord* p = Universe::heap()->block_start(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 bool print = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // If we couldn't find it it just may mean that heap wasn't parseable
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // See if we were just given an oop directly
a61af66fc99e Initial load
duke
parents:
diff changeset
603 if (p != NULL && Universe::heap()->block_is_obj(p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 print = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 } else if (p == NULL && ((oopDesc*)addr)->is_oop()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 p = (HeapWord*) addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 print = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 if (print) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 oop(p)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
611 if (p != (HeapWord*)x && oop(p)->is_constMethod() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
612 constMethodOop(p)->contains(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
614 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 methodHandle mh (thread, constMethodOop(p)->method());
a61af66fc99e Initial load
duke
parents:
diff changeset
616 if (!mh->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 tty->print_cr("bci_from(%p) = %d; print_codes():",
a61af66fc99e Initial load
duke
parents:
diff changeset
618 addr, mh->bci_from(address(x)));
a61af66fc99e Initial load
duke
parents:
diff changeset
619 mh->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 }
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
624 } else if (Universe::heap()->is_in_reserved(addr)) {
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
625 tty->print_cr(INTPTR_FORMAT " is an unallocated location in the heap", addr);
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
626 return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 }
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
628
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629 if (JNIHandles::is_global_handle((jobject) addr)) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
630 tty->print_cr(INTPTR_FORMAT " is a global jni handle", addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (JNIHandles::is_weak_global_handle((jobject) addr)) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
634 tty->print_cr(INTPTR_FORMAT " is a weak global jni handle", addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
637 if (JNIHandleBlock::any_contains((jobject) addr)) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
638 tty->print_cr(INTPTR_FORMAT " is a local jni handle", addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
643 // Check for privilege stack
0
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (thread->privileged_stack_top() != NULL && thread->privileged_stack_top()->contains(addr)) {
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
645 tty->print_cr(INTPTR_FORMAT " is pointing into the privilege stack for thread: " INTPTR_FORMAT, addr, thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
646 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // If the addr is a java thread print information about that.
a61af66fc99e Initial load
duke
parents:
diff changeset
649 if (addr == (address)thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 thread->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
651 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Try an OS specific find
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (os::find(addr)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 if (print_pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 tty->print_cr(INTPTR_FORMAT ": probably in C++ code; check debugger", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
662 Disassembler::decode(same_page(addr-40,addr),same_page(addr+40,addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
663 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
432
275a3b7ff0d6 6770949: minor tweaks before 6655638
jrose
parents: 356
diff changeset
666 tty->print_cr(INTPTR_FORMAT " is pointing to unknown location", addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 class LookForRefInGenClosure : public OopsInGenClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
672 oop target;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 void do_oop(oop* o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
674 if (o != NULL && *o == target) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
675 tty->print_cr(INTPTR_FORMAT, o);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
678 void do_oop(narrowOop* o) { ShouldNotReachHere(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 };
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 class LookForRefInObjectClosure : public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
683 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
684 LookForRefInGenClosure look_in_object;
a61af66fc99e Initial load
duke
parents:
diff changeset
685 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
686 LookForRefInObjectClosure(oop target) { look_in_object.target = target; }
a61af66fc99e Initial load
duke
parents:
diff changeset
687 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 obj->oop_iterate(&look_in_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690 };
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 static void findref(intptr_t x) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
694 CollectedHeap *ch = Universe::heap();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 LookForRefInGenClosure lookFor;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 lookFor.target = (oop) x;
a61af66fc99e Initial load
duke
parents:
diff changeset
697 LookForRefInObjectClosure look_in_object((oop) x);
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 tty->print_cr("Searching heap:");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
700 ch->object_iterate(&look_in_object);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
701
a61af66fc99e Initial load
duke
parents:
diff changeset
702 tty->print_cr("Searching strong roots:");
a61af66fc99e Initial load
duke
parents:
diff changeset
703 Universe::oops_do(&lookFor, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
704 JNIHandles::oops_do(&lookFor); // Global (strong) JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
705 Threads::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
706 ObjectSynchronizer::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 //FlatProfiler::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 SystemDictionary::oops_do(&lookFor);
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 tty->print_cr("Done.");
a61af66fc99e Initial load
duke
parents:
diff changeset
711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 class FindClassObjectClosure: public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
715 const char* _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
717 FindClassObjectClosure(const char name[]) { _target = name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 virtual void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 if (obj->is_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 Klass* k = klassOop(obj)->klass_part();
a61af66fc99e Initial load
duke
parents:
diff changeset
722 if (k->name() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 const char* ext = k->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
725 if ( strcmp(_target, ext) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 tty->print_cr("Found " INTPTR_FORMAT, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
727 obj->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732 };
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 //
a61af66fc99e Initial load
duke
parents:
diff changeset
735 extern "C" void findclass(const char name[]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 Command c("findclass");
a61af66fc99e Initial load
duke
parents:
diff changeset
737 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 tty->print_cr("Finding class %s -> ", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 FindClassObjectClosure srch(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
740 Universe::heap()->permanent_object_iterate(&srch);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // Another interface that isn't ambiguous in dbx.
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // Can we someday rename the other find to hsfind?
a61af66fc99e Initial load
duke
parents:
diff changeset
746 extern "C" void hsfind(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 Command c("hsfind");
a61af66fc99e Initial load
duke
parents:
diff changeset
748 find(x, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 extern "C" void hsfindref(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 Command c("hsfindref");
a61af66fc99e Initial load
duke
parents:
diff changeset
754 findref(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 extern "C" void find(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 Command c("find");
a61af66fc99e Initial load
duke
parents:
diff changeset
759 find(x, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 extern "C" void findpc(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 Command c("findpc");
a61af66fc99e Initial load
duke
parents:
diff changeset
765 find(x, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // int versions of all methods to avoid having to type type casts in the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 void pp(intptr_t p) { pp((void*)p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 void pp(oop p) { pp((void*)p); }
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 void help() {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 Command c("help");
a61af66fc99e Initial load
duke
parents:
diff changeset
776 tty->print_cr("basic");
a61af66fc99e Initial load
duke
parents:
diff changeset
777 tty->print_cr(" pp(void* p) - try to make sense of p");
a61af66fc99e Initial load
duke
parents:
diff changeset
778 tty->print_cr(" pv(intptr_t p)- ((PrintableResourceObj*) p)->print()");
a61af66fc99e Initial load
duke
parents:
diff changeset
779 tty->print_cr(" ps() - print current thread stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 tty->print_cr(" pss() - print all thread stacks");
a61af66fc99e Initial load
duke
parents:
diff changeset
781 tty->print_cr(" pm(int pc) - print methodOop given compiled PC");
a61af66fc99e Initial load
duke
parents:
diff changeset
782 tty->print_cr(" findm(intptr_t pc) - finds methodOop");
a61af66fc99e Initial load
duke
parents:
diff changeset
783 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
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 tty->print_cr("misc.");
a61af66fc99e Initial load
duke
parents:
diff changeset
786 tty->print_cr(" flush() - flushes the log file");
a61af66fc99e Initial load
duke
parents:
diff changeset
787 tty->print_cr(" events() - dump last 50 events");
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 tty->print_cr("compiler debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
791 tty->print_cr(" debug() - to set things up for compiler debugging");
a61af66fc99e Initial load
duke
parents:
diff changeset
792 tty->print_cr(" ndebug() - undo debug");
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // BobV's command parser for debugging on windows when nothing else works.
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 enum CommandID {
a61af66fc99e Initial load
duke
parents:
diff changeset
800 CMDID_HELP,
a61af66fc99e Initial load
duke
parents:
diff changeset
801 CMDID_QUIT,
a61af66fc99e Initial load
duke
parents:
diff changeset
802 CMDID_HSFIND,
a61af66fc99e Initial load
duke
parents:
diff changeset
803 CMDID_PSS,
a61af66fc99e Initial load
duke
parents:
diff changeset
804 CMDID_PS,
a61af66fc99e Initial load
duke
parents:
diff changeset
805 CMDID_PSF,
a61af66fc99e Initial load
duke
parents:
diff changeset
806 CMDID_FINDM,
a61af66fc99e Initial load
duke
parents:
diff changeset
807 CMDID_FINDNM,
a61af66fc99e Initial load
duke
parents:
diff changeset
808 CMDID_PP,
a61af66fc99e Initial load
duke
parents:
diff changeset
809 CMDID_BPT,
a61af66fc99e Initial load
duke
parents:
diff changeset
810 CMDID_EXIT,
a61af66fc99e Initial load
duke
parents:
diff changeset
811 CMDID_VERIFY,
a61af66fc99e Initial load
duke
parents:
diff changeset
812 CMDID_THREADS,
a61af66fc99e Initial load
duke
parents:
diff changeset
813 CMDID_ILLEGAL = 99
a61af66fc99e Initial load
duke
parents:
diff changeset
814 };
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 struct CommandParser {
a61af66fc99e Initial load
duke
parents:
diff changeset
817 char *name;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 CommandID code;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 char *description;
a61af66fc99e Initial load
duke
parents:
diff changeset
820 };
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 struct CommandParser CommandList[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 (char *)"help", CMDID_HELP, " Dump this list",
a61af66fc99e Initial load
duke
parents:
diff changeset
824 (char *)"quit", CMDID_QUIT, " Return from this routine",
a61af66fc99e Initial load
duke
parents:
diff changeset
825 (char *)"hsfind", CMDID_HSFIND, "Perform an hsfind on an address",
a61af66fc99e Initial load
duke
parents:
diff changeset
826 (char *)"ps", CMDID_PS, " Print Current Thread Stack Trace",
a61af66fc99e Initial load
duke
parents:
diff changeset
827 (char *)"pss", CMDID_PSS, " Print All Thread Stack Trace",
a61af66fc99e Initial load
duke
parents:
diff changeset
828 (char *)"psf", CMDID_PSF, " Print All Stack Frames",
a61af66fc99e Initial load
duke
parents:
diff changeset
829 (char *)"findm", CMDID_FINDM, " Find a methodOop from a PC",
a61af66fc99e Initial load
duke
parents:
diff changeset
830 (char *)"findnm", CMDID_FINDNM, "Find an nmethod from a PC",
a61af66fc99e Initial load
duke
parents:
diff changeset
831 (char *)"pp", CMDID_PP, " Find out something about a pointer",
a61af66fc99e Initial load
duke
parents:
diff changeset
832 (char *)"break", CMDID_BPT, " Execute a breakpoint",
a61af66fc99e Initial load
duke
parents:
diff changeset
833 (char *)"exitvm", CMDID_EXIT, "Exit the VM",
a61af66fc99e Initial load
duke
parents:
diff changeset
834 (char *)"verify", CMDID_VERIFY, "Perform a Heap Verify",
a61af66fc99e Initial load
duke
parents:
diff changeset
835 (char *)"thread", CMDID_THREADS, "Dump Info on all Threads",
a61af66fc99e Initial load
duke
parents:
diff changeset
836 (char *)0, CMDID_ILLEGAL
a61af66fc99e Initial load
duke
parents:
diff changeset
837 };
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // get_debug_command()
a61af66fc99e Initial load
duke
parents:
diff changeset
841 //
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // Read a command from standard input.
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // This is useful when you have a debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // which doesn't support calling into functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
845 //
a61af66fc99e Initial load
duke
parents:
diff changeset
846 void get_debug_command()
a61af66fc99e Initial load
duke
parents:
diff changeset
847 {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 ssize_t count;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 int i,j;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 bool gotcommand;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 intptr_t addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 char buffer[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
853 nmethod *nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 methodOop m;
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 tty->print_cr("You have entered the diagnostic command interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
857 tty->print("The supported commands are:\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
858 for ( i=0; ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 if ( CommandList[i].code == CMDID_ILLEGAL )
a61af66fc99e Initial load
duke
parents:
diff changeset
860 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 tty->print_cr(" %s \n", CommandList[i].name );
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 gotcommand = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 tty->print("Please enter a command: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
867 count = scanf("%s", buffer) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 if ( count >=0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 for ( i=0; ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870 if ( CommandList[i].code == CMDID_ILLEGAL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 if (!gotcommand) tty->print("Invalid command, please try again\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
872 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874 if ( strcmp(buffer, CommandList[i].name) == 0 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
875 gotcommand = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 switch ( CommandList[i].code ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
877 case CMDID_PS:
a61af66fc99e Initial load
duke
parents:
diff changeset
878 ps();
a61af66fc99e Initial load
duke
parents:
diff changeset
879 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 case CMDID_PSS:
a61af66fc99e Initial load
duke
parents:
diff changeset
881 pss();
a61af66fc99e Initial load
duke
parents:
diff changeset
882 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 case CMDID_PSF:
a61af66fc99e Initial load
duke
parents:
diff changeset
884 psf();
a61af66fc99e Initial load
duke
parents:
diff changeset
885 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 case CMDID_FINDM:
a61af66fc99e Initial load
duke
parents:
diff changeset
887 tty->print("Please enter the hex addr to pass to findm: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
888 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 m = (methodOop)findm(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 tty->print("findm(0x%I64X) returned 0x%I64X\n", addr, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 case CMDID_FINDNM:
a61af66fc99e Initial load
duke
parents:
diff changeset
893 tty->print("Please enter the hex addr to pass to findnm: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
894 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
895 nm = (nmethod*)findnm(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
896 tty->print("findnm(0x%I64X) returned 0x%I64X\n", addr, nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
897 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 case CMDID_PP:
a61af66fc99e Initial load
duke
parents:
diff changeset
899 tty->print("Please enter the hex addr to pass to pp: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
900 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 pp((void*)addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
903 case CMDID_EXIT:
a61af66fc99e Initial load
duke
parents:
diff changeset
904 exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 case CMDID_HELP:
a61af66fc99e Initial load
duke
parents:
diff changeset
906 tty->print("Here are the supported commands: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
907 for ( j=0; ; j++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
908 if ( CommandList[j].code == CMDID_ILLEGAL )
a61af66fc99e Initial load
duke
parents:
diff changeset
909 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
910 tty->print_cr(" %s -- %s\n", CommandList[j].name,
a61af66fc99e Initial load
duke
parents:
diff changeset
911 CommandList[j].description );
a61af66fc99e Initial load
duke
parents:
diff changeset
912 }
a61af66fc99e Initial load
duke
parents:
diff changeset
913 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 case CMDID_QUIT:
a61af66fc99e Initial load
duke
parents:
diff changeset
915 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
917 case CMDID_BPT:
a61af66fc99e Initial load
duke
parents:
diff changeset
918 BREAKPOINT;
a61af66fc99e Initial load
duke
parents:
diff changeset
919 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
920 case CMDID_VERIFY:
a61af66fc99e Initial load
duke
parents:
diff changeset
921 verify();;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
923 case CMDID_THREADS:
a61af66fc99e Initial load
duke
parents:
diff changeset
924 threads();;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 case CMDID_HSFIND:
a61af66fc99e Initial load
duke
parents:
diff changeset
927 tty->print("Please enter the hex addr to pass to hsfind: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
928 scanf("%I64X", &addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
929 tty->print("Calling hsfind(0x%I64X)\n", addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 hsfind(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
932 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
933 case CMDID_ILLEGAL:
a61af66fc99e Initial load
duke
parents:
diff changeset
934 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 #endif // PRODUCT