< prev index next >

src/share/vm/utilities/vmError.cpp

Print this page
rev 13549 : 8185712: [windows] Improve native symbol decoder
Reviewed-by: goetz, zgu


 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);


< prev index next >