8035983: Fix "Native frames:" in crash report (hs_err file)
authorkvn
Wed, 05 Mar 2014 16:21:22 -0800
changeset 23204 e5c4480df562
parent 23203 76c2a23e2537
child 23205 534774811483
child 23208 4c37d91b8b09
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
hotspot/src/share/vm/utilities/vmError.cpp
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Wed Mar 05 15:14:25 2014 +0100
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Wed Mar 05 16:21:22 2014 -0800
@@ -592,13 +592,24 @@
              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 (_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 (os::is_first_C_frame(&fr)) break;
-             fr = os::get_sender_for_C_frame(&fr);
           }
 
           if (count > StackPrintLimit) {