hotspot/src/share/vm/utilities/vmError.cpp

Print this page

        

@@ -507,17 +507,52 @@
      // printing Java thread stack trace if it is involved in GC crash
      if (_verbose && (_thread->is_Named_thread())) {
        JavaThread*  jt = ((NamedThread *)_thread)->processed_thread();
        if (jt != NULL) {
          st->print_cr("JavaThread " PTR_FORMAT " (nid = " UINTX_FORMAT ") was being processed", jt, jt->osthread()->thread_id());
+#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()) {
              sfs.current()->print_on_error(st, buf, sizeof(buf), true);
              st->cr();
            }
          }
+#endif // ZERO
        }
      }
 
   STEP(140, "(printing VM operation)" )