comparison src/share/vm/utilities/vmError.cpp @ 14677:e0365e7b7454

8035983: Fix "Native frames:" in crash report (hs_err file) Summary: check fr.sender_sp() in java thread instead of os::is_first_C_frame(&fr). Reviewed-by: twisti, coleenp
author kvn
date Wed, 05 Mar 2014 16:21:22 -0800
parents 183bd5c00828
children b51e29501f30 78bbf4d43a14 364b73402247
comparison
equal deleted inserted replaced
14676:d3f14809b051 14677:e0365e7b7454
590 while (count++ < StackPrintLimit) { 590 while (count++ < StackPrintLimit) {
591 fr.print_on_error(st, buf, sizeof(buf)); 591 fr.print_on_error(st, buf, sizeof(buf));
592 st->cr(); 592 st->cr();
593 // Compiled code may use EBP register on x86 so it looks like 593 // Compiled code may use EBP register on x86 so it looks like
594 // non-walkable C frame. Use frame.sender() for java frames. 594 // non-walkable C frame. Use frame.sender() for java frames.
595 if (_thread && _thread->is_Java_thread() && fr.is_java_frame()) { 595 if (_thread && _thread->is_Java_thread()) {
596 RegisterMap map((JavaThread*)_thread, false); // No update 596 // Catch very first native frame by using stack address.
597 fr = fr.sender(&map); 597 // For JavaThread stack_base and stack_size should be set.
598 continue; 598 if (!_thread->on_local_stack((address)(fr.sender_sp() + 1))) {
599 break;
600 }
601 if (fr.is_java_frame()) {
602 RegisterMap map((JavaThread*)_thread, false); // No update
603 fr = fr.sender(&map);
604 } else {
605 fr = os::get_sender_for_C_frame(&fr);
606 }
607 } else {
608 // is_first_C_frame() does only simple checks for frame pointer,
609 // it will pass if java compiled code has a pointer in EBP.
610 if (os::is_first_C_frame(&fr)) break;
611 fr = os::get_sender_for_C_frame(&fr);
599 } 612 }
600 if (os::is_first_C_frame(&fr)) break;
601 fr = os::get_sender_for_C_frame(&fr);
602 } 613 }
603 614
604 if (count > StackPrintLimit) { 615 if (count > StackPrintLimit) {
605 st->print_cr("...<more frames>..."); 616 st->print_cr("...<more frames>...");
606 } 617 }