73 int n_failures() { return _n_failures; } |
73 int n_failures() { return _n_failures; } |
74 |
74 |
75 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
75 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
76 virtual void do_oop( oop* p) { do_oop_work(p); } |
76 virtual void do_oop( oop* p) { do_oop_work(p); } |
77 |
77 |
|
78 void print_object(outputStream* out, oop obj) { |
|
79 #ifdef PRODUCT |
|
80 klassOop k = obj->klass(); |
|
81 const char* class_name = instanceKlass::cast(k)->external_name(); |
|
82 out->print_cr("class name %s", class_name); |
|
83 #else // PRODUCT |
|
84 obj->print_on(out); |
|
85 #endif // PRODUCT |
|
86 } |
|
87 |
78 template <class T> void do_oop_work(T* p) { |
88 template <class T> void do_oop_work(T* p) { |
79 assert(_containing_obj != NULL, "Precondition"); |
89 assert(_containing_obj != NULL, "Precondition"); |
80 assert(!_g1h->is_obj_dead_cond(_containing_obj, _use_prev_marking), |
90 assert(!_g1h->is_obj_dead_cond(_containing_obj, _use_prev_marking), |
81 "Precondition"); |
91 "Precondition"); |
82 T heap_oop = oopDesc::load_heap_oop(p); |
92 T heap_oop = oopDesc::load_heap_oop(p); |
88 if (!_failures) { |
98 if (!_failures) { |
89 gclog_or_tty->print_cr(""); |
99 gclog_or_tty->print_cr(""); |
90 gclog_or_tty->print_cr("----------"); |
100 gclog_or_tty->print_cr("----------"); |
91 } |
101 } |
92 if (!_g1h->is_in_closed_subset(obj)) { |
102 if (!_g1h->is_in_closed_subset(obj)) { |
|
103 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); |
93 gclog_or_tty->print_cr("Field "PTR_FORMAT |
104 gclog_or_tty->print_cr("Field "PTR_FORMAT |
94 " of live obj "PTR_FORMAT |
105 " of live obj "PTR_FORMAT" in region " |
95 " points to obj "PTR_FORMAT |
106 "["PTR_FORMAT", "PTR_FORMAT")", |
96 " not in the heap.", |
107 p, (void*) _containing_obj, |
97 p, (void*) _containing_obj, (void*) obj); |
108 from->bottom(), from->end()); |
|
109 print_object(gclog_or_tty, _containing_obj); |
|
110 gclog_or_tty->print_cr("points to obj "PTR_FORMAT" not in the heap", |
|
111 (void*) obj); |
98 } else { |
112 } else { |
|
113 HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); |
|
114 HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj); |
99 gclog_or_tty->print_cr("Field "PTR_FORMAT |
115 gclog_or_tty->print_cr("Field "PTR_FORMAT |
100 " of live obj "PTR_FORMAT |
116 " of live obj "PTR_FORMAT" in region " |
101 " points to dead obj "PTR_FORMAT".", |
117 "["PTR_FORMAT", "PTR_FORMAT")", |
102 p, (void*) _containing_obj, (void*) obj); |
118 p, (void*) _containing_obj, |
|
119 from->bottom(), from->end()); |
|
120 print_object(gclog_or_tty, _containing_obj); |
|
121 gclog_or_tty->print_cr("points to dead obj "PTR_FORMAT" in region " |
|
122 "["PTR_FORMAT", "PTR_FORMAT")", |
|
123 (void*) obj, to->bottom(), to->end()); |
|
124 print_object(gclog_or_tty, obj); |
103 } |
125 } |
104 gclog_or_tty->print_cr("Live obj:"); |
|
105 _containing_obj->print_on(gclog_or_tty); |
|
106 gclog_or_tty->print_cr("Bad referent:"); |
|
107 obj->print_on(gclog_or_tty); |
|
108 gclog_or_tty->print_cr("----------"); |
126 gclog_or_tty->print_cr("----------"); |
109 _failures = true; |
127 _failures = true; |
110 failed = true; |
128 failed = true; |
111 _n_failures++; |
129 _n_failures++; |
112 } |
130 } |