src/share/vm/utilities/vmError.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 8035983 Cdiff src/share/vm/utilities/vmError.cpp

src/share/vm/utilities/vmError.cpp

Print this page

        

*** 590,607 **** 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() && fr.is_java_frame()) { RegisterMap map((JavaThread*)_thread, false); // No update fr = fr.sender(&map); ! continue; } if (os::is_first_C_frame(&fr)) break; fr = os::get_sender_for_C_frame(&fr); } if (count > StackPrintLimit) { st->print_cr("...<more frames>..."); } --- 590,617 ---- 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>..."); }
src/share/vm/utilities/vmError.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File