hotspot/src/share/vm/utilities/vmError.cpp
changeset 4013 b154310845de
parent 2154 72a9b7284ccf
child 4489 514173c9a0c2
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Wed Oct 07 15:38:37 2009 -0700
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Tue Oct 13 12:04:21 2009 -0700
@@ -458,6 +458,40 @@
 
      if (_verbose && _thread && _thread->is_Java_thread()) {
        JavaThread* jt = (JavaThread*)_thread;
+#ifdef ZERO
+       if (jt->zero_stack()->sp() && jt->top_zero_frame()) {
+         // StackFrameStream uses the frame anchor, which may not have
+         // been set up.  This can be done at any time in Zero, however,
+         // so if it hasn't been set up then we just set it up now and
+         // clear it again when we're done.
+         bool has_last_Java_frame = jt->has_last_Java_frame();
+         if (!has_last_Java_frame)
+           jt->set_last_Java_frame();
+         st->print("Java frames:");
+
+         // If the top frame is a Shark frame and the frame anchor isn't
+         // set up then it's possible that the information in the frame
+         // is garbage: it could be from a previous decache, or it could
+         // simply have never been written.  So we print a warning...
+         StackFrameStream sfs(jt);
+         if (!has_last_Java_frame && !sfs.is_done()) {
+           if (sfs.current()->zeroframe()->is_shark_frame()) {
+             st->print(" (TOP FRAME MAY BE JUNK)");
+           }
+         }
+         st->cr();
+
+         // Print the frames
+         for(int i = 0; !sfs.is_done(); sfs.next(), i++) {
+           sfs.current()->zero_print_on_error(i, st, buf, sizeof(buf));
+           st->cr();
+         }
+
+         // Reset the frame anchor if necessary
+         if (!has_last_Java_frame)
+           jt->reset_last_Java_frame();
+       }
+#else
        if (jt->has_last_Java_frame()) {
          st->print_cr("Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)");
          for(StackFrameStream sfs(jt); !sfs.is_done(); sfs.next()) {
@@ -465,6 +499,7 @@
            st->cr();
          }
        }
+#endif // ZERO
      }
 
   STEP(140, "(printing VM operation)" )