215 #else
216 if (jt->has_last_Java_frame()) {
217 st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
218 for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
219 sfs.current()->print_on_error(st, buf, buflen, verbose);
220 st->cr();
221 }
222 }
223 #endif // ZERO
224 }
225
226 void VMError::print_native_stack(outputStream* st, frame fr, Thread* t, char* buf, int buf_size) {
227
228 // see if it's a valid frame
229 if (fr.pc()) {
230 st->print_cr("Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)");
231
232 int count = 0;
233 while (count++ < StackPrintLimit) {
234 fr.print_on_error(st, buf, buf_size);
235 st->cr();
236 // Compiled code may use EBP register on x86 so it looks like
237 // non-walkable C frame. Use frame.sender() for java frames.
238 if (t && t->is_Java_thread()) {
239 // Catch very first native frame by using stack address.
240 // For JavaThread stack_base and stack_size should be set.
241 if (!t->on_local_stack((address)(fr.real_fp() + 1))) {
242 break;
243 }
244 if (fr.is_java_frame() || fr.is_native_frame() || fr.is_runtime_frame()) {
245 RegisterMap map((JavaThread*)t, false); // No update
246 fr = fr.sender(&map);
247 } else {
248 fr = os::get_sender_for_C_frame(&fr);
249 }
250 } else {
251 // is_first_C_frame() does only simple checks for frame pointer,
252 // it will pass if java compiled code has a pointer in EBP.
253 if (os::is_first_C_frame(&fr)) break;
254 fr = os::get_sender_for_C_frame(&fr);
|
215 #else
216 if (jt->has_last_Java_frame()) {
217 st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
218 for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
219 sfs.current()->print_on_error(st, buf, buflen, verbose);
220 st->cr();
221 }
222 }
223 #endif // ZERO
224 }
225
226 void VMError::print_native_stack(outputStream* st, frame fr, Thread* t, char* buf, int buf_size) {
227
228 // see if it's a valid frame
229 if (fr.pc()) {
230 st->print_cr("Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)");
231
232 int count = 0;
233 while (count++ < StackPrintLimit) {
234 fr.print_on_error(st, buf, buf_size);
235 if (fr.pc()) { // print source file and line, if available
236 char buf[128];
237 int line_no;
238 if (Decoder::get_source_info(fr.pc(), buf, sizeof(buf), &line_no)) {
239 st->print(" (%s:%d)", buf, line_no);
240 }
241 }
242 st->cr();
243 // Compiled code may use EBP register on x86 so it looks like
244 // non-walkable C frame. Use frame.sender() for java frames.
245 if (t && t->is_Java_thread()) {
246 // Catch very first native frame by using stack address.
247 // For JavaThread stack_base and stack_size should be set.
248 if (!t->on_local_stack((address)(fr.real_fp() + 1))) {
249 break;
250 }
251 if (fr.is_java_frame() || fr.is_native_frame() || fr.is_runtime_frame()) {
252 RegisterMap map((JavaThread*)t, false); // No update
253 fr = fr.sender(&map);
254 } else {
255 fr = os::get_sender_for_C_frame(&fr);
256 }
257 } else {
258 // is_first_C_frame() does only simple checks for frame pointer,
259 // it will pass if java compiled code has a pointer in EBP.
260 if (os::is_first_C_frame(&fr)) break;
261 fr = os::get_sender_for_C_frame(&fr);
|