< prev index next >

src/share/vm/utilities/debug.cpp

Print this page




 701   // see if it's a valid frame
 702   if (fr.pc()) {
 703     st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
 704 
 705     int count = 0;
 706     while (count++ < StackPrintLimit) {
 707       fr.print_on_error(st, buf, buf_size);
 708       st->cr();
 709       // Compiled code may use EBP register on x86 so it looks like
 710       // non-walkable C frame. Use frame.sender() for java frames.
 711       if (t && t->is_Java_thread()) {
 712         // Catch very first native frame by using stack address.
 713         // For JavaThread stack_base and stack_size should be set.
 714         if (!t->on_local_stack((address)(fr.real_fp() + 1))) {
 715           break;
 716         }
 717         if (fr.is_java_frame() || fr.is_native_frame() || fr.is_runtime_frame()) {
 718           RegisterMap map((JavaThread*)t, false); // No update
 719           fr = fr.sender(&map);
 720         } else {
 721           fr = os::get_sender_for_C_frame(&fr);
 722         }
 723       } else {
 724         // is_first_C_frame() does only simple checks for frame pointer,
 725         // it will pass if java compiled code has a pointer in EBP.
 726         if (os::is_first_C_frame(&fr)) break;
 727         fr = os::get_sender_for_C_frame(&fr);
 728       }
 729     }
 730 
 731     if (count > StackPrintLimit) {
 732       st->print_cr("...<more frames>...");
 733     }
 734 
 735     st->cr();
 736   }
 737 }
 738 
 739 #ifndef PRODUCT
 740 
 741 extern "C" void pns(void* sp, void* fp, void* pc) { // print native stack
 742   Command c("pns");
 743   static char buf[O_BUFLEN];
 744   Thread* t = ThreadLocalStorage::get_thread_slow();
 745   // Call generic frame constructor (certain arguments may be ignored)
 746   frame fr(sp, fp, pc);
 747   print_native_stack(tty, fr, t, buf, sizeof(buf));
 748 }
 749 
 750 #endif // !PRODUCT


 701   // see if it's a valid frame
 702   if (fr.pc()) {
 703     st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
 704 
 705     int count = 0;
 706     while (count++ < StackPrintLimit) {
 707       fr.print_on_error(st, buf, buf_size);
 708       st->cr();
 709       // Compiled code may use EBP register on x86 so it looks like
 710       // non-walkable C frame. Use frame.sender() for java frames.
 711       if (t && t->is_Java_thread()) {
 712         // Catch very first native frame by using stack address.
 713         // For JavaThread stack_base and stack_size should be set.
 714         if (!t->on_local_stack((address)(fr.real_fp() + 1))) {
 715           break;
 716         }
 717         if (fr.is_java_frame() || fr.is_native_frame() || fr.is_runtime_frame()) {
 718           RegisterMap map((JavaThread*)t, false); // No update
 719           fr = fr.sender(&map);
 720         } else {
 721           fr = os::get_sender_for_C_frame(t, &fr);
 722         }
 723       } else {
 724         // is_first_C_frame() does only simple checks for frame pointer,
 725         // it will pass if java compiled code has a pointer in EBP.
 726         if (os::is_first_C_frame(&fr)) break;
 727         fr = os::get_sender_for_C_frame(t, &fr);
 728       }
 729     }
 730 
 731     if (count > StackPrintLimit) {
 732       st->print_cr("...<more frames>...");
 733     }
 734 
 735     st->cr();
 736   }
 737 }
 738 
 739 #ifndef PRODUCT
 740 
 741 extern "C" void pns(void* sp, void* fp, void* pc) { // print native stack
 742   Command c("pns");
 743   static char buf[O_BUFLEN];
 744   Thread* t = ThreadLocalStorage::get_thread_slow();
 745   // Call generic frame constructor (certain arguments may be ignored)
 746   frame fr(t, sp, fp, pc);
 747   print_native_stack(tty, fr, t, buf, sizeof(buf));
 748 }
 749 
 750 #endif // !PRODUCT
< prev index next >