Add logs in CompactPage for null-pointer exception
Bug: 160737021
Bug: 272272332
Test: install module and check of tombstones/ANR due to NPE in GC thread
Change-Id: I46b9539599a4766f3a4f27416b0ebb387f44e582
diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc
index 3c2606a..1751994 100644
--- a/runtime/gc/collector/mark_compact.cc
+++ b/runtime/gc/collector/mark_compact.cc
@@ -1434,6 +1434,7 @@
uint32_t offset,
uint8_t* addr,
bool needs_memset_zero) {
+ mirror::Object* first_obj = obj;
DCHECK(moving_space_bitmap_->Test(obj)
&& live_words_bitmap_->Test(obj));
DCHECK(live_words_bitmap_->Test(offset)) << "obj=" << obj
@@ -1525,7 +1526,25 @@
+ kPageSize));
}
obj_size = RoundUp(obj_size, kAlignment);
- DCHECK_GT(obj_size, offset_within_obj);
+ CHECK_GT(obj_size, offset_within_obj)
+ << "obj:" << obj
+ << " class:"
+ << obj->GetClass<kDefaultVerifyFlags, kWithFromSpaceBarrier>()
+ << " to_addr:" << to_ref
+ << " first-obj:" << first_obj
+ << " black-allocation-begin:" << reinterpret_cast<void*>(black_allocations_begin_)
+ << " post-compact-end:" << reinterpret_cast<void*>(post_compact_end_)
+ << " offset:" << offset * kAlignment
+ << " class-after-obj-iter:"
+ << (class_after_obj_iter_ != class_after_obj_ordered_map_.rend() ?
+ class_after_obj_iter_->first.AsMirrorPtr() : nullptr)
+ << " last-reclaimed-page:" << reinterpret_cast<void*>(last_reclaimed_page_)
+ << " last-checked-reclaim-page-idx:" << last_checked_reclaim_page_idx_
+ << " offset-of-last-idx:"
+ << pre_compact_offset_moving_space_[last_checked_reclaim_page_idx_] * kAlignment
+ << " first-obj-of-last-idx:"
+ << first_objs_moving_space_[last_checked_reclaim_page_idx_].AsMirrorPtr();
+
obj_size -= offset_within_obj;
// If there is only one stride, then adjust last_stride_begin to the
// end of the first object.
@@ -1571,6 +1590,26 @@
MemberOffset(0),
MemberOffset(end_addr - (addr + bytes_done)));
obj_size = RoundUp(obj_size, kAlignment);
+ CHECK_GT(obj_size, 0u)
+ << "from_addr:" << obj
+ << " from-space-class:"
+ << obj->GetClass<kDefaultVerifyFlags, kWithFromSpaceBarrier>()
+ << " to_addr:" << ref
+ << " first-obj:" << first_obj
+ << " black-allocation-begin:" << reinterpret_cast<void*>(black_allocations_begin_)
+ << " post-compact-end:" << reinterpret_cast<void*>(post_compact_end_)
+ << " offset:" << offset * kAlignment
+ << " bytes_done:" << bytes_done
+ << " class-after-obj-iter:"
+ << (class_after_obj_iter_ != class_after_obj_ordered_map_.rend() ?
+ class_after_obj_iter_->first.AsMirrorPtr() : nullptr)
+ << " last-reclaimed-page:" << reinterpret_cast<void*>(last_reclaimed_page_)
+ << " last-checked-reclaim-page-idx:" << last_checked_reclaim_page_idx_
+ << " offset-of-last-idx:"
+ << pre_compact_offset_moving_space_[last_checked_reclaim_page_idx_] * kAlignment
+ << " first-obj-of-last-idx:"
+ << first_objs_moving_space_[last_checked_reclaim_page_idx_].AsMirrorPtr();
+
from_addr += obj_size;
bytes_done += obj_size;
}
@@ -1959,6 +1998,13 @@
(state == PageState::kUnprocessed &&
(mode == kFallbackMode || idx > moving_first_objs_count_)));
}
+ DCHECK_LE(idx, last_checked_reclaim_page_idx_);
+ if (idx == last_checked_reclaim_page_idx_) {
+ // Nothing to do. Also, this possibly avoids freeing from-space pages too
+ // soon. TODO: Update the comment if returning here indeed fixed NPE like
+ // in b/272272332.
+ return;
+ }
uint8_t* reclaim_begin;
uint8_t* idx_addr;