diff options
| -rw-r--r-- | runtime/gc/collector/mark_compact.cc | 17 | ||||
| -rw-r--r-- | runtime/gc/collector/mark_compact.h | 6 |
2 files changed, 22 insertions, 1 deletions
diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc index 4d220e331e..fafd8b55b4 100644 --- a/runtime/gc/collector/mark_compact.cc +++ b/runtime/gc/collector/mark_compact.cc @@ -4538,7 +4538,14 @@ void MarkCompact::ScanObject(mirror::Object* obj) { } if (klass == nullptr) { // It must be heap corruption. - LOG(FATAL_WITHOUT_ABORT) << "klass pointer for obj: " << obj << " found to be null."; + LOG(FATAL_WITHOUT_ABORT) << "klass pointer for obj: " << obj << " found to be null." + << " black_dense_end: " << static_cast<void*>(black_dense_end_) + << " mid_gen_end: " << static_cast<void*>(mid_gen_end_) + << " prev_post_compact_end: " << prev_post_compact_end_ + << " prev_black_allocations_begin: " << prev_black_allocations_begin_ + << " prev_black_dense_end: " << prev_black_dense_end_ + << " prev_gc_young: " << prev_gc_young_ + << " prev_gc_performed_comaction: " << prev_gc_performed_compaction_; heap_->GetVerification()->LogHeapCorruption( obj, mirror::Object::ClassOffset(), klass, /*fatal=*/true); } @@ -4817,6 +4824,14 @@ void MarkCompact::FinishPhase(bool performed_compaction) { compacting_ = false; marking_done_ = false; uint8_t* mark_bitmap_clear_end = black_dense_end_; + // Retain values of some fields for logging in next GC cycle, in case there is + // a memory corruption detected. + prev_black_allocations_begin_ = static_cast<void*>(black_allocations_begin_); + prev_black_dense_end_ = static_cast<void*>(black_dense_end_); + prev_post_compact_end_ = static_cast<void*>(post_compact_end_); + prev_gc_young_ = young_gen_; + prev_gc_performed_compaction_ = performed_compaction; + // Whether compaction is performend or not, we always set post_compact_end_ // before reaching here. CHECK_NE(post_compact_end_, nullptr); diff --git a/runtime/gc/collector/mark_compact.h b/runtime/gc/collector/mark_compact.h index 8392bfec96..d9083fcb2c 100644 --- a/runtime/gc/collector/mark_compact.h +++ b/runtime/gc/collector/mark_compact.h @@ -931,6 +931,12 @@ class MarkCompact final : public GarbageCollector { // is incorporated. void* stack_high_addr_; void* stack_low_addr_; + // Following values for logging purposes + void* prev_post_compact_end_; + void* prev_black_dense_end_; + void* prev_black_allocations_begin_; + bool prev_gc_young_; + bool prev_gc_performed_compaction_; class FlipCallback; class ThreadFlipVisitor; |