diff a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp --- a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp +++ b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp @@ -66,11 +66,11 @@ T heap_oop = RawAccess<>::oop_load(p); if (!CompressedOops::is_null(heap_oop)) { oop obj = CompressedOops::decode_not_null(heap_oop); if (_g1h->is_obj_dead_cond(obj, _vo)) { Log(gc, verify) log; - log.error("Root location " PTR_FORMAT " points to dead obj " PTR_FORMAT, p2i(p), p2i(obj)); + log.error("Root location " PTR_FORMAT " points to dead obj " PTR_FORMAT " vo %d", p2i(p), p2i(obj), _vo); ResourceMark rm; LogStream ls(log.error()); obj->print_on(&ls); _failures = true; } @@ -181,21 +181,30 @@ }; class VerifyLivenessOopClosure: public BasicOopIterateClosure { G1CollectedHeap* _g1h; VerifyOption _vo; + oop _o; public: - VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo): - _g1h(g1h), _vo(vo) + VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo, oop o): + _g1h(g1h), _vo(vo), _o(o) { } void do_oop(narrowOop *p) { do_oop_work(p); } void do_oop( oop *p) { do_oop_work(p); } template void do_oop_work(T *p) { oop obj = RawAccess<>::oop_load(p); guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo), - "Dead object referenced by a not dead object"); + "vo %d Dead object " PTR_FORMAT " (%s) referenced by a not dead object " PTR_FORMAT " (%s) _g1h->is_obj_dead_cond(obj, _vo) %d marked %d since prev mark %d since next mark %d", + _vo, + p2i(obj), _g1h->heap_region_containing(obj)->get_short_type_str(), + p2i(_o), _g1h->heap_region_containing(_o)->get_short_type_str(), + _g1h->is_obj_dead_cond(obj, _vo), + _g1h->concurrent_mark()->prev_mark_bitmap()->is_marked(_o), + _g1h->heap_region_containing(_o)->obj_allocated_since_prev_marking(_o), + _g1h->heap_region_containing(_o)->obj_allocated_since_next_marking(_o) + ); } }; class VerifyObjsInRegionClosure: public ObjectClosure { private: @@ -210,11 +219,11 @@ VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo) : _live_bytes(0), _hr(hr), _vo(vo) { _g1h = G1CollectedHeap::heap(); } void do_object(oop o) { - VerifyLivenessOopClosure isLive(_g1h, _vo); + VerifyLivenessOopClosure isLive(_g1h, _vo, o); assert(o != NULL, "Huh?"); if (!_g1h->is_obj_dead_cond(o, _vo)) { // If the object is alive according to the full gc mark, // then verify that the marking information agrees. // Note we can't verify the contra-positive of the