ART: Weaken size check in hprof

Dumping the heap is a two-phase process. In the first phase, all
objects are visited to fill the header tables. In the second phase,
the tables are written out and the heap is visited again to write
the object records.

Deleting global references doesn't require the mutator lock. So it
is possible to delete a global ref in-between the first and the
second phase. This leads to a smaller set of object records. The
result is still safe, as the object's class etc. is still in the
header tables, and the object won't be deleted, so will still be
dumped by itself.

Bug: 23521263
Change-Id: I019c29b13ceb9f13e362c742662f1546d52c37a0
diff --git a/runtime/hprof/hprof.cc b/runtime/hprof/hprof.cc
index a2a4f0d..ba28861 100644
--- a/runtime/hprof/hprof.cc
+++ b/runtime/hprof/hprof.cc
@@ -671,8 +671,9 @@
       okay = !file_output.Errors();
 
       if (okay) {
-        // Check for expected size.
-        CHECK_EQ(file_output.SumLength(), overall_size);
+        // Check for expected size. Output is expected to be less-or-equal than first phase, see
+        // b/23521263.
+        DCHECK_LE(file_output.SumLength(), overall_size);
       }
       output_ = nullptr;
     }
@@ -716,8 +717,8 @@
     // Write the dump.
     ProcessHeap(true);
 
-    // Check for expected size.
-    CHECK_EQ(net_output.SumLength(), overall_size + kChunkHeaderSize);
+    // Check for expected size. See DumpToFile for comment.
+    DCHECK_LE(net_output.SumLength(), overall_size + kChunkHeaderSize);
     output_ = nullptr;
 
     return true;