| Index: runtime/vm/heap_profiler.h
|
| ===================================================================
|
| --- runtime/vm/heap_profiler.h (revision 31864)
|
| +++ runtime/vm/heap_profiler.h (working copy)
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -#ifndef VM_HEAP_PROFILER_H_
|
| -#define VM_HEAP_PROFILER_H_
|
| -
|
| -#include <set>
|
| -
|
| -#include "include/dart_api.h"
|
| -#include "vm/globals.h"
|
| -#include "vm/handles.h"
|
| -#include "vm/object.h"
|
| -#include "vm/visitor.h"
|
| -
|
| -namespace dart {
|
| -
|
| -// A HeapProfiler writes a snapshot of the heap for off-line analysis.
|
| -// The heap is written in binary HPROF format, which is a sequence of
|
| -// self describing records. A description of the HPROF format can be
|
| -// found at
|
| -//
|
| -// http://java.net/downloads/heap-snapshot/hprof-binary-format.html
|
| -//
|
| -// HPROF was not designed for Dart, but most Dart concepts can be
|
| -// mapped directly into HPROF. Some features, such as immediate
|
| -// objects and variable length objects, require a translation.
|
| -class HeapProfiler {
|
| - public:
|
| - enum Tag {
|
| - kStringInUtf8 = 0x01,
|
| - kLoadClass = 0x02,
|
| - kUnloadClass = 0x03,
|
| - kStackFrame = 0x04,
|
| - kStackTrace = 0x05,
|
| - kAllocSites = 0x06,
|
| - kHeapSummary = 0x07,
|
| - kStartThread = 0x0A,
|
| - kEndThread = 0x0B,
|
| - kHeapDump = 0x0C,
|
| - kCpuSamples = 0x0D,
|
| - kControlSettings = 0x0E,
|
| - kHeapDumpSummary = 0x1C,
|
| - kHeapDumpEnd = 0x2C
|
| - };
|
| -
|
| - // Sub-record tags describe sub-records within a heap dump.
|
| - enum Subtag {
|
| - kRootJniGlobal = 0x01,
|
| - kRootJniLocal = 0x01,
|
| - kRootJavaFrame = 0x03,
|
| - kRootNativeStack = 0x04,
|
| - kRootStickyClass = 0x05,
|
| - kRootThreadBlock = 0x06,
|
| - kRootMonitorUsed = 0x07,
|
| - kRootThreadObject = 0x08,
|
| - kClassDump = 0x20,
|
| - kInstanceDump = 0x21,
|
| - kObjectArrayDump = 0x22,
|
| - kPrimitiveArrayDump = 0x23,
|
| - kRootUnknown = 0xFF
|
| - };
|
| -
|
| - // Tags for describing element and field types.
|
| - enum BasicType {
|
| - kObject = 2,
|
| - kBoolean = 4,
|
| - kChar = 5,
|
| - kFloat = 6,
|
| - kDouble = 7,
|
| - kByte = 8,
|
| - kShort = 9,
|
| - kInt = 10,
|
| - kLong = 11
|
| - };
|
| -
|
| - // Object ids for fake classes.
|
| - //
|
| - // While not necessary to describe Dart programs, third party tools
|
| - // expect these types. These tools also interpret id values as raw
|
| - // addresses so we space them by 8 to not look like compressed oops.
|
| - enum FakeClass {
|
| - kJavaLangClass = 1,
|
| - kJavaLangClassLoader = 9,
|
| - kJavaLangObject = 17,
|
| - kJavaLangString = 25,
|
| - kArrayObject = 33,
|
| - kArrayBoolean = 41,
|
| - kArrayChar = 49,
|
| - kArrayFloat = 57,
|
| - kArrayDouble = 65,
|
| - kArrayByte = 73,
|
| - kArrayShort = 81,
|
| - kArrayInt = 89,
|
| - kArrayLong = 97
|
| - };
|
| -
|
| - static const int kObjectIdSize = sizeof(uint64_t); // NOLINT
|
| -
|
| - HeapProfiler(Dart_FileWriteCallback callback, void* stream);
|
| - ~HeapProfiler();
|
| -
|
| - // Writes a root to the heap dump.
|
| - void WriteRoot(const RawObject* raw_obj);
|
| -
|
| - // Writes a object to the heap dump.
|
| - void WriteObject(const RawObject* raw_obj);
|
| -
|
| - private:
|
| - // Record tags describe top-level records.
|
| - // A growable array of bytes used to build a record body.
|
| - class Buffer {
|
| - public:
|
| - Buffer() : data_(0), size_(0), capacity_(0) {
|
| - }
|
| - ~Buffer();
|
| -
|
| - // Writes an array of bytes to the buffer, increasing the capacity
|
| - // as needed.
|
| - void Write(const uint8_t* data, intptr_t length);
|
| -
|
| - // Returns the underlying element storage.
|
| - const uint8_t* Data() const {
|
| - return data_;
|
| - }
|
| -
|
| - // Returns the number of elements written to the buffer.
|
| - intptr_t Size() const {
|
| - return size_;
|
| - }
|
| -
|
| - private:
|
| - // Resizes the element storage, if needed.
|
| - void EnsureCapacity(intptr_t size);
|
| -
|
| - uint8_t* data_;
|
| -
|
| - intptr_t size_;
|
| -
|
| - // Size of the element storage.
|
| - intptr_t capacity_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Buffer);
|
| - };
|
| -
|
| - // A top-level data record.
|
| - class Record {
|
| - public:
|
| - Record(uint8_t tag, HeapProfiler* profiler)
|
| - : tag_(tag), profiler_(profiler) {
|
| - }
|
| - ~Record() {
|
| - profiler_->WriteRecord(*this);
|
| - }
|
| -
|
| - // Returns the tag describing the record format.
|
| - uint8_t Tag() const {
|
| - return tag_;
|
| - }
|
| -
|
| - // Returns a millisecond time delta, always 0.
|
| - uint8_t Time() const {
|
| - return 0;
|
| - }
|
| -
|
| - // Returns the record length in bytes.
|
| - uint32_t Length() const {
|
| - return body_.Size();
|
| - }
|
| -
|
| - // Returns the record body.
|
| - const uint8_t* Body() const {
|
| - return body_.Data();
|
| - }
|
| -
|
| - // Appends an array of 8-bit values to the record body.
|
| - void Write(const uint8_t* value, intptr_t size);
|
| -
|
| - // Appends an 8-, 16-, 32- or 64-bit value to the body in
|
| - // big-endian format.
|
| - void Write8(uint8_t value);
|
| - void Write16(uint16_t value);
|
| - void Write32(uint32_t value);
|
| - void Write64(uint64_t value);
|
| -
|
| - // Appends an ID to the body.
|
| - void WriteObjectId(const void* value);
|
| -
|
| - private:
|
| - // A tag value that describes the record format.
|
| - uint8_t tag_;
|
| -
|
| - // The payload of the record as described by the tag.
|
| - Buffer body_;
|
| -
|
| - // Parent object.
|
| - HeapProfiler* profiler_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Record);
|
| - };
|
| -
|
| - // A sub-record within a heap dump record. Write calls are
|
| - // forwarded to the profilers heap dump record instance.
|
| - class SubRecord {
|
| - public:
|
| - // Starts a new sub-record within the heap dump record.
|
| - SubRecord(uint8_t sub_tag, HeapProfiler* profiler);
|
| - ~SubRecord();
|
| -
|
| - // Appends an array of 8-bit values to the heap dump record.
|
| - void Write(const uint8_t* value, intptr_t size);
|
| -
|
| - // Appends an 8-, 16-, 32- or 64-bit value to the heap dump
|
| - // record.
|
| - void Write8(uint8_t value);
|
| - void Write16(uint16_t value);
|
| - void Write32(uint32_t value);
|
| - void Write64(uint64_t value);
|
| -
|
| - // Appends an ID to the current heap dump record.
|
| - void WriteObjectId(const void* value);
|
| -
|
| - private:
|
| - // The record instance that receives forwarded write calls.
|
| - Record* record_;
|
| - };
|
| -
|
| - // Id canonizers.
|
| - const RawClass* ClassId(const RawClass* raw_class);
|
| - const RawObject* ObjectId(const RawObject* raw_obj);
|
| - const char* StringId(const char* c_string);
|
| - const RawString* StringId(const RawString* raw_string);
|
| -
|
| - // Invokes the write callback.
|
| - void Write(const void* data, intptr_t size);
|
| -
|
| - // Writes the binary hprof header to the output stream.
|
| - void WriteHeader();
|
| -
|
| - // Writes a record to the output stream.
|
| - void WriteRecord(const Record& record);
|
| -
|
| - // Writes a string in utf-8 record to the output stream.
|
| - void WriteStringInUtf8(const char* c_string);
|
| - void WriteStringInUtf8(const RawString* raw_string);
|
| -
|
| - // Writes a load class record to the output stream.
|
| - void WriteLoadClass(const RawClass* raw_class);
|
| - void WriteFakeLoadClass(FakeClass fake_class, const char* class_name);
|
| -
|
| - // Writes an empty stack trace to the output stream.
|
| - void WriteStackTrace();
|
| -
|
| - // Writes a heap summary record to the output stream.
|
| - void WriteHeapSummary(uint32_t total_live_bytes,
|
| - uint32_t total_live_instances,
|
| - uint64_t total_bytes_allocated,
|
| - uint64_t total_instances_allocated);
|
| -
|
| - // Writes a heap dump record to the output stream.
|
| - void WriteHeapDump();
|
| -
|
| - // Writes a sub-record to the heap dump record.
|
| - void WriteClassDump(const RawClass* raw_class);
|
| - void WriteFakeClassDump(FakeClass fake_class, FakeClass fake_super_class);
|
| - void WriteInstanceDump(const RawObject* raw_obj);
|
| - void WriteSmiInstanceDump(const RawSmi* raw_smi);
|
| - void WriteObjectArrayDump(const RawArray* raw_array);
|
| - void WritePrimitiveArrayDump(const RawTypedData* raw_byte_array, uint8_t tag);
|
| -
|
| - static const RawClass* GetClass(const RawObject* raw_obj);
|
| - static const RawClass* GetSuperClass(const RawClass* raw_class);
|
| -
|
| - Dart_FileWriteCallback write_callback_;
|
| -
|
| - void* output_stream_;
|
| -
|
| - Record* heap_dump_record_;
|
| -
|
| - std::set<const RawSmi*> smi_table_;
|
| - std::set<const RawClass*> class_table_;
|
| - std::set<const RawString*> string_table_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HeapProfiler);
|
| -};
|
| -
|
| -
|
| -// Writes a root sub-record to the heap dump for every strong handle.
|
| -class HeapProfilerRootVisitor : public ObjectPointerVisitor {
|
| - public:
|
| - explicit HeapProfilerRootVisitor(HeapProfiler* profiler)
|
| - : ObjectPointerVisitor(Isolate::Current()),
|
| - profiler_(profiler) {
|
| - }
|
| -
|
| - virtual void VisitPointers(RawObject** first, RawObject** last);
|
| -
|
| - private:
|
| - HeapProfiler* profiler_;
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(HeapProfilerRootVisitor);
|
| -};
|
| -
|
| -
|
| -// Writes a root sub-record to the heap dump for every weak handle.
|
| -class HeapProfilerWeakRootVisitor : public HandleVisitor {
|
| - public:
|
| - explicit HeapProfilerWeakRootVisitor(HeapProfilerRootVisitor* visitor)
|
| - : visitor_(visitor) {
|
| - }
|
| -
|
| - virtual void VisitHandle(uword addr);
|
| -
|
| - private:
|
| - HeapProfilerRootVisitor* visitor_;
|
| - DISALLOW_COPY_AND_ASSIGN(HeapProfilerWeakRootVisitor);
|
| -};
|
| -
|
| -
|
| -// Writes a sub-record to the heap dump for every object in the heap.
|
| -class HeapProfilerObjectVisitor : public ObjectVisitor {
|
| - public:
|
| - HeapProfilerObjectVisitor(Isolate* isolate, HeapProfiler* profiler)
|
| - : ObjectVisitor(isolate), profiler_(profiler) {
|
| - }
|
| -
|
| - virtual void VisitObject(RawObject* obj);
|
| -
|
| - private:
|
| - HeapProfiler* profiler_;
|
| - DISALLOW_COPY_AND_ASSIGN(HeapProfilerObjectVisitor);
|
| -};
|
| -
|
| -} // namespace dart
|
| -
|
| -#endif // VM_HEAP_PROFILER_H_
|
|
|