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)" )