src/share/vm/utilities/vmError.cpp
Print this page
rev 7023 : 8058345: Refactor native stack printing from vmError.cpp to debug.cpp to make it available in gdb as well
Summary: Also fix stack trace on x86 to enable walking of runtime stubs and native wrappers
*** 583,629 ****
// Windows/x64 needs special handling.
} else {
frame fr = _context ? os::fetch_frame_from_context(_context)
: os::current_frame();
! // see if it's a valid frame
! if (fr.pc()) {
! st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
!
!
! int count = 0;
! while (count++ < StackPrintLimit) {
! fr.print_on_error(st, buf, sizeof(buf));
! st->cr();
! // Compiled code may use EBP register on x86 so it looks like
! // non-walkable C frame. Use frame.sender() for java frames.
! if (_thread && _thread->is_Java_thread()) {
! // Catch very first native frame by using stack address.
! // For JavaThread stack_base and stack_size should be set.
! if (!_thread->on_local_stack((address)(fr.sender_sp() + 1))) {
! break;
! }
! if (fr.is_java_frame()) {
! RegisterMap map((JavaThread*)_thread, false); // No update
! fr = fr.sender(&map);
! } else {
! fr = os::get_sender_for_C_frame(&fr);
! }
! } else {
! // is_first_C_frame() does only simple checks for frame pointer,
! // it will pass if java compiled code has a pointer in EBP.
! if (os::is_first_C_frame(&fr)) break;
! fr = os::get_sender_for_C_frame(&fr);
! }
! }
!
! if (count > StackPrintLimit) {
! st->print_cr("...<more frames>...");
! }
!
! st->cr();
! }
}
}
STEP(130, "(printing Java stack)" )
--- 583,593 ----
// Windows/x64 needs special handling.
} else {
frame fr = _context ? os::fetch_frame_from_context(_context)
: os::current_frame();
! print_native_stack(st, fr, _thread, buf, sizeof(buf));
}
}
STEP(130, "(printing Java stack)" )