[vm, service] Include Smis in heap snapshots.

TEST=ci
Change-Id: Iadb3bb749da0d065c46bc723c7f5a8a8951b68bd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/265562
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak 2022-10-26 16:04:29 +00:00 committed by Commit Queue
parent 6d5c966e68
commit 2d6037a144
5 changed files with 62 additions and 13 deletions

View file

@ -92,8 +92,10 @@ var tests = <IsolateTest>[
for (SnapshotObject instance in klass.instances) {
if (instance == graph.root ||
instance.klass.name.contains("Isolate") ||
instance.klass.name.contains("Read-Only Pages")) {
instance.klass.name.contains("Read-Only Pages") ||
instance.klass.name.contains("_Smi")) {
// The root and fake root subdivisions have 0 self size.
// Immediate objects (currently only Smi) have 0 self size.
expect(instance.internalSize, greaterThanOrEqualTo(0));
expect(instance.externalSize, greaterThanOrEqualTo(0));
expect(instance.shallowSize, greaterThanOrEqualTo(0));
@ -126,8 +128,10 @@ var tests = <IsolateTest>[
for (SnapshotObject instance in graph.objects) {
if (instance == graph.root ||
instance.klass.name.contains("Isolate") ||
instance.klass.name.contains("Read-Only Pages")) {
instance.klass.name.contains("Read-Only Pages") ||
instance.klass.name.contains("_Smi")) {
// The root and fake root subdivisions have 0 self size.
// Immediate objects (currently only Smi) have 0 self size.
expect(instance.internalSize, greaterThanOrEqualTo(0));
expect(instance.externalSize, greaterThanOrEqualTo(0));
expect(instance.shallowSize, greaterThanOrEqualTo(0));

View file

@ -92,8 +92,10 @@ var tests = <IsolateTest>[
for (SnapshotObject instance in klass.instances) {
if (instance == graph.root ||
instance.klass.name.contains("Isolate") ||
instance.klass.name.contains("Read-Only Pages")) {
instance.klass.name.contains("Read-Only Pages") ||
instance.klass.name.contains("_Smi")) {
// The root and fake root subdivisions have 0 self size.
// Immediate objects (currently only Smi) have 0 self size.
expect(instance.internalSize, greaterThanOrEqualTo(0));
expect(instance.externalSize, greaterThanOrEqualTo(0));
expect(instance.shallowSize, greaterThanOrEqualTo(0));
@ -126,8 +128,10 @@ var tests = <IsolateTest>[
for (SnapshotObject instance in graph.objects) {
if (instance == graph.root ||
instance.klass.name.contains("Isolate") ||
instance.klass.name.contains("Read-Only Pages")) {
instance.klass.name.contains("Read-Only Pages") ||
instance.klass.name.contains("_Smi")) {
// The root and fake root subdivisions have 0 self size.
// Immediate objects (currently only Smi) have 0 self size.
expect(instance.internalSize, greaterThanOrEqualTo(0));
expect(instance.externalSize, greaterThanOrEqualTo(0));
expect(instance.shallowSize, greaterThanOrEqualTo(0));

View file

@ -189,7 +189,7 @@ size unique-size count class data
''');
await run(
'stats foobar = (follow (follow global) ^:type_arguments ^Root)');
'stats foobar = (follow (follow global) ^:type_arguments ^Root ^Smi)');
expectLogPattern('''
size count class
-------- -------- --------

View file

@ -869,7 +869,10 @@ CountingPage* HeapSnapshotWriter::FindCountingPage(ObjectPtr obj) const {
}
void HeapSnapshotWriter::AssignObjectId(ObjectPtr obj) {
ASSERT(obj->IsHeapObject());
if (!obj->IsHeapObject()) {
thread()->heap()->SetObjectId(obj, ++object_count_);
return;
}
CountingPage* counting_page = FindCountingPage(obj);
if (counting_page != nullptr) {
@ -883,7 +886,9 @@ void HeapSnapshotWriter::AssignObjectId(ObjectPtr obj) {
intptr_t HeapSnapshotWriter::GetObjectId(ObjectPtr obj) const {
if (!obj->IsHeapObject()) {
return 0;
intptr_t id = thread()->heap()->GetObjectId(obj);
ASSERT(id != 0);
return id;
}
if (FLAG_write_protect_code && obj->IsInstructions() && !OnImagePage(obj)) {
@ -916,6 +921,13 @@ void HeapSnapshotWriter::CountExternalProperty() {
external_property_count_ += 1;
}
void HeapSnapshotWriter::AddSmi(SmiPtr smi) {
if (thread()->heap()->GetObjectId(smi) == WeakTable::kNoValue) {
thread()->heap()->SetObjectId(smi, -1);
smis_.Add(smi);
}
}
class Pass1Visitor : public ObjectVisitor,
public ObjectPointerVisitor,
public HandleVisitor {
@ -941,17 +953,25 @@ class Pass1Visitor : public ObjectVisitor,
}
void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
intptr_t count = to - from + 1;
ASSERT(count >= 0);
writer_->CountReferences(count);
for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
ObjectPtr obj = *ptr;
if (!obj->IsHeapObject()) {
writer_->AddSmi(static_cast<SmiPtr>(obj));
}
writer_->CountReferences(1);
}
}
void VisitCompressedPointers(uword heap_base,
CompressedObjectPtr* from,
CompressedObjectPtr* to) {
intptr_t count = to - from + 1;
ASSERT(count >= 0);
writer_->CountReferences(count);
for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
ObjectPtr obj = ptr->Decompress(heap_base);
if (!obj->IsHeapObject()) {
writer_->AddSmi(static_cast<SmiPtr>(obj));
}
writer_->CountReferences(1);
}
}
void VisitHandle(uword addr) {
@ -1559,6 +1579,11 @@ void HeapSnapshotWriter::Write() {
// External properties.
isolate()->group()->VisitWeakPersistentHandles(&visitor);
// Smis.
for (SmiPtr smi : smis_) {
AssignObjectId(smi);
}
}
{
@ -1618,6 +1643,15 @@ void HeapSnapshotWriter::Write() {
visitor.set_discount_sizes(false);
iteration.IterateObjects(&visitor);
// Smis.
for (SmiPtr smi : smis_) {
WriteUnsigned(kSmiCid + kNumExtraCids);
WriteUnsigned(0); // Heap size.
WriteUnsigned(kIntData);
WriteUnsigned(Smi::Value(smi));
WriteUnsigned(0); // No slots.
}
// External properties.
WriteUnsigned(external_property_count_);
isolate()->group()->VisitWeakPersistentHandles(&visitor);
@ -1638,6 +1672,10 @@ void HeapSnapshotWriter::Write() {
// Handle visit rest of the objects.
iteration.IterateVMIsolateObjects(&visitor);
iteration.IterateObjects(&visitor);
for (SmiPtr smi : smis_) {
USE(smi);
WriteUnsigned(0); // No identity hash.
}
}
ClearObjectIds();

View file

@ -217,6 +217,7 @@ class HeapSnapshotWriter : public ThreadStackResource {
void ClearObjectIds();
void CountReferences(intptr_t count);
void CountExternalProperty();
void AddSmi(SmiPtr smi);
void Write();
@ -254,6 +255,8 @@ class HeapSnapshotWriter : public ThreadStackResource {
static const intptr_t kMaxImagePages = 4;
ImagePageRange image_page_ranges_[kMaxImagePages];
MallocGrowableArray<SmiPtr> smis_;
DISALLOW_COPY_AND_ASSIGN(HeapSnapshotWriter);
};