--- a/hotspot/src/share/vm/runtime/thread.cpp Sat Sep 03 14:03:54 2011 -0700
+++ b/hotspot/src/share/vm/runtime/thread.cpp Mon Sep 05 17:09:05 2011 -0700
@@ -2859,6 +2859,44 @@
}
}
+class PrintAndVerifyOopClosure: public OopClosure {
+ protected:
+ template <class T> inline void do_oop_work(T* p) {
+ oop obj = oopDesc::load_decode_heap_oop(p);
+ if (obj == NULL) return;
+ tty->print(INTPTR_FORMAT ": ", p);
+ if (obj->is_oop_or_null()) {
+ if (obj->is_objArray()) {
+ tty->print_cr("valid objArray: " INTPTR_FORMAT, (oopDesc*) obj);
+ } else {
+ obj->print();
+ }
+ } else {
+ tty->print_cr("invalid oop: " INTPTR_FORMAT, (oopDesc*) obj);
+ }
+ tty->cr();
+ }
+ public:
+ virtual void do_oop(oop* p) { do_oop_work(p); }
+ virtual void do_oop(narrowOop* p) { do_oop_work(p); }
+};
+
+
+static void oops_print(frame* f, const RegisterMap *map) {
+ PrintAndVerifyOopClosure print;
+ f->print_value();
+ f->oops_do(&print, NULL, (RegisterMap*)map);
+}
+
+// Print our all the locations that contain oops and whether they are
+// valid or not. This useful when trying to find the oldest frame
+// where an oop has gone bad since the frame walk is from youngest to
+// oldest.
+void JavaThread::trace_oops() {
+ tty->print_cr("[Trace oops]");
+ frames_do(oops_print);
+}
+
#ifdef ASSERT
// Print or validate the layout of stack frames