OSDN Git Service

Send holder to Mark in ConcurrentCopying::Process for GC verification
authorMathieu Chartier <mathieuc@google.com>
Thu, 18 May 2017 17:01:07 +0000 (10:01 -0700)
committerMathieu Chartier <mathieuc@google.com>
Thu, 18 May 2017 19:45:09 +0000 (12:45 -0700)
Aims to log more when heap corruption is detected.

Test: test-art-host-gtest-verification_test
Test: test-art-host

Bug: 38409177
Bug: 37187694

(cherry picked from commit 4ce0c765cf7bcaba4da4990b7b9c1f115ec25198)

Change-Id: I8907923ce67c6040ea467b4e3ae00a4b607f8c7c

runtime/gc/collector/concurrent_copying.cc
runtime/gc/verification.cc

index 596b4be..849d42a 100644 (file)
@@ -1959,7 +1959,10 @@ inline void ConcurrentCopying::Process(mirror::Object* obj, MemberOffset offset)
   DCHECK_EQ(Thread::Current(), thread_running_gc_);
   mirror::Object* ref = obj->GetFieldObject<
       mirror::Object, kVerifyNone, kWithoutReadBarrier, false>(offset);
-  mirror::Object* to_ref = Mark</*kGrayImmuneObject*/false, /*kFromGCThread*/true>(ref);
+  mirror::Object* to_ref = Mark</*kGrayImmuneObject*/false, /*kFromGCThread*/true>(
+      ref,
+      /*holder*/ obj,
+      offset);
   if (to_ref == ref) {
     return;
   }
index 7b31c8a..c14f250 100644 (file)
@@ -86,8 +86,8 @@ void Verification::LogHeapCorruption(ObjPtr<mirror::Object> holder,
   std::ostringstream oss;
   oss << "GC tried to mark invalid reference " << ref << std::endl;
   oss << DumpObjectInfo(ref, "ref") << "\n";
+  oss << DumpObjectInfo(holder.Ptr(), "holder");
   if (holder != nullptr) {
-    oss << DumpObjectInfo(holder.Ptr(), "holder");
     mirror::Class* holder_klass = holder->GetClass<kVerifyNone, kWithoutReadBarrier>();
     if (IsValidClass(holder_klass)) {
       oss << "field_offset=" << offset.Uint32Value();