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 |