OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/heap_profiler.h" | 5 #include "vm/heap_profiler.h" |
6 | 6 |
7 #include "vm/dart_api_state.h" | 7 #include "vm/dart_api_state.h" |
8 #include "vm/object.h" | 8 #include "vm/object.h" |
9 #include "vm/raw_object.h" | 9 #include "vm/raw_object.h" |
10 #include "vm/stack_frame.h" | 10 #include "vm/stack_frame.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
117 : write_callback_(callback), | 117 : write_callback_(callback), |
118 output_stream_(stream), | 118 output_stream_(stream), |
119 heap_dump_record_(NULL) { | 119 heap_dump_record_(NULL) { |
120 WriteHeader(); | 120 WriteHeader(); |
121 WriteStackTrace(); | 121 WriteStackTrace(); |
122 heap_dump_record_ = new Record(kHeapDump, this); | 122 heap_dump_record_ = new Record(kHeapDump, this); |
123 } | 123 } |
124 | 124 |
125 | 125 |
126 HeapProfiler::~HeapProfiler() { | 126 HeapProfiler::~HeapProfiler() { |
127 for (std::set<const RawSmi*>::iterator it = smi_table_.begin(); | |
cshapiro
2013/01/12 02:52:26
You might consider using this idiom...
for_each
| |
128 it != smi_table_.end(); | |
129 ++it) { | |
130 WriteSmiDump(*it); | |
131 } | |
127 delete heap_dump_record_; | 132 delete heap_dump_record_; |
128 } | 133 } |
129 | 134 |
130 | 135 |
131 const RawObject* HeapProfiler::ObjectId(const RawObject* raw_obj) { | 136 const RawObject* HeapProfiler::ObjectId(const RawObject* raw_obj) { |
132 if (!raw_obj->IsHeapObject()) { | 137 if (!raw_obj->IsHeapObject()) { |
133 // To describe an immediate object in HPROF we record its value | 138 // To describe an immediate object in HPROF we record its value |
134 // and write fake INSTANCE_DUMP subrecord in the HEAP_DUMP record. | 139 // and write fake INSTANCE_DUMP subrecord in the HEAP_DUMP record. |
135 const RawSmi* raw_smi = reinterpret_cast<const RawSmi*>(raw_obj); | 140 const RawSmi* raw_smi = reinterpret_cast<const RawSmi*>(raw_obj); |
136 if (smi_table_.find(raw_smi) == smi_table_.end()) { | 141 if (smi_table_.find(raw_smi) == smi_table_.end()) { |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
559 ASSERT(raw_field->ptr()->name_ != String::null()); | 564 ASSERT(raw_field->ptr()->name_ != String::null()); |
560 // field name string ID | 565 // field name string ID |
561 sub.WriteObjectId(StringId(raw_field->ptr()->name_)); | 566 sub.WriteObjectId(StringId(raw_field->ptr()->name_)); |
562 // type of field | 567 // type of field |
563 sub.Write8(kObject); | 568 sub.Write8(kObject); |
564 } | 569 } |
565 } | 570 } |
566 } | 571 } |
567 } | 572 } |
568 | 573 |
574 // INSTANCE DUMP - 0x21 | |
cshapiro
2013/01/12 02:52:26
We probably do not need to repeat this documentati
Ivan Posva
2013/01/14 23:38:42
Done.
| |
575 // | |
576 // Format: | |
577 // ID - object ID | |
578 // u4 - stack trace serial number | |
579 // ID - class object ID | |
580 // u4 - number of bytes that follow | |
581 // [value]* - instance field values (this class, followed by super class, etc) | |
582 void HeapProfiler::WriteSmiDump(const RawSmi* raw_smi) { | |
583 ASSERT(!raw_smi->IsHeapObject()); | |
584 SubRecord sub(kInstanceDump, this); | |
585 // object ID | |
586 sub.WriteObjectId(raw_smi); | |
siva
2013/01/14 23:50:13
Since we are writing out smi values as an object i
Ivan Posva
2013/01/14 23:53:38
IDs from the heap profiler dump perspective are th
cshapiro
2013/01/14 23:55:22
It should not. We use an object's address as its
| |
587 // stack trace serial number | |
588 sub.Write32(0); | |
589 // class object ID | |
590 sub.WriteObjectId(Isolate::Current()->class_table()->At(kSmiCid)); | |
591 // number of bytes that follow | |
592 sub.Write32(0); | |
593 } | |
594 | |
569 | 595 |
570 // INSTANCE DUMP - 0x21 | 596 // INSTANCE DUMP - 0x21 |
571 // | 597 // |
572 // Format: | 598 // Format: |
573 // ID - object ID | 599 // ID - object ID |
574 // u4 - stack trace serial number | 600 // u4 - stack trace serial number |
575 // ID - class object ID | 601 // ID - class object ID |
576 // u4 - number of bytes that follow | 602 // u4 - number of bytes that follow |
577 // [value]* - instance field values (this class, followed by super class, etc) | 603 // [value]* - instance field values (this class, followed by super class, etc) |
578 void HeapProfiler::WriteInstanceDump(const RawObject* raw_obj) { | 604 void HeapProfiler::WriteInstanceDump(const RawObject* raw_obj) { |
605 ASSERT(raw_obj->IsHeapObject()); | |
579 SubRecord sub(kInstanceDump, this); | 606 SubRecord sub(kInstanceDump, this); |
580 // object ID | 607 // object ID |
581 sub.WriteObjectId(raw_obj); | 608 sub.WriteObjectId(raw_obj); |
582 // stack trace serial number | 609 // stack trace serial number |
583 sub.Write32(0); | 610 sub.Write32(0); |
584 // class object ID | 611 // class object ID |
585 sub.WriteObjectId(ClassId(GetClass(raw_obj))); | 612 sub.WriteObjectId(ClassId(GetClass(raw_obj))); |
586 // number of bytes that follow | 613 // number of bytes that follow |
587 intptr_t num_instance_fields = 0; | 614 intptr_t num_instance_fields = 0; |
588 for (const RawClass* cls = GetClass(raw_obj); | 615 for (const RawClass* cls = GetClass(raw_obj); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
719 RawObject* raw_obj = handle->raw(); | 746 RawObject* raw_obj = handle->raw(); |
720 visitor_->VisitPointer(&raw_obj); | 747 visitor_->VisitPointer(&raw_obj); |
721 } | 748 } |
722 | 749 |
723 | 750 |
724 void HeapProfilerObjectVisitor::VisitObject(RawObject* raw_obj) { | 751 void HeapProfilerObjectVisitor::VisitObject(RawObject* raw_obj) { |
725 profiler_->WriteObject(raw_obj); | 752 profiler_->WriteObject(raw_obj); |
726 } | 753 } |
727 | 754 |
728 } // namespace dart | 755 } // namespace dart |
OLD | NEW |