194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved. 294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// found in the LICENSE file. 494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#ifndef BASE_TRACE_EVENT_HEAP_PROFILER_HEAP_DUMP_WRITER_H_ 694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define BASE_TRACE_EVENT_HEAP_PROFILER_HEAP_DUMP_WRITER_H_ 794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <stddef.h> 994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <memory> 1194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <set> 1294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/base_export.h" 1494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/containers/hash_tables.h" 1594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/macros.h" 1694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/trace_event/heap_profiler_allocation_context.h" 1794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveznamespace base { 1994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveznamespace trace_event { 2094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass MemoryDumpSessionState; 2294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass StackFrameDeduplicator; 2394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass TracedValue; 2494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass TypeNameDeduplicator; 2594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Aggregates |metrics_by_context|, recursively breaks down the heap, and 2794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// returns a traced value with an "entries" array that can be dumped in the 2894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// trace log, following the format described in https://goo.gl/KY7zVE. The 2994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// number of entries is kept reasonable because long tails are not included. 3094ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezBASE_EXPORT std::unique_ptr<TracedValue> ExportHeapDump( 3194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez const hash_map<AllocationContext, AllocationMetrics>& metrics_by_context, 3294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez const MemoryDumpSessionState& session_state); 3394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveznamespace internal { 3594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveznamespace { 3794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstruct Bucket; 3894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 3994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 4094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// An entry in the "entries" array as described in https://goo.gl/KY7zVE. 4194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstruct BASE_EXPORT Entry { 4294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez size_t size; 4394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez size_t count; 4494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 4594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // References a backtrace in the stack frame deduplicator. -1 means empty 4694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // backtrace (the root of the tree). 4794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int stack_frame_id; 4894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 4994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // References a type name in the type name deduplicator. -1 indicates that 5094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // the size is the cumulative size for all types (the root of the tree). 5194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int type_id; 5294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}; 5394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 5494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Comparison operator to enable putting |Entry| in a |std::set|. 5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezBASE_EXPORT bool operator<(Entry lhs, Entry rhs); 5694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 5794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Serializes entries to an "entries" array in a traced value. 5894ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezBASE_EXPORT std::unique_ptr<TracedValue> Serialize(const std::set<Entry>& dump); 5994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 6094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Helper class to dump a snapshot of an |AllocationRegister| or other heap 6194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// bookkeeping structure into a |TracedValue|. This class is intended to be 6294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// used as a one-shot local instance on the stack. 6394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezclass BASE_EXPORT HeapDumpWriter { 6494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez public: 6594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // The |stack_frame_deduplicator| and |type_name_deduplicator| are not owned. 6694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // The heap dump writer assumes exclusive access to them during the lifetime 6794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // of the dump writer. The heap dumps are broken down for allocations bigger 6894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // than |breakdown_threshold_bytes|. 6994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez HeapDumpWriter(StackFrameDeduplicator* stack_frame_deduplicator, 7094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TypeNameDeduplicator* type_name_deduplicator, 7194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez uint32_t breakdown_threshold_bytes); 7294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 7394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ~HeapDumpWriter(); 7494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 7594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Aggregates allocations to compute the total size of the heap, then breaks 7694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // down the heap recursively. This produces the values that should be dumped 7794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // in the "entries" array. The number of entries is kept reasonable because 7894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // long tails are not included. Use |Serialize| to convert to a traced value. 7994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez const std::set<Entry>& Summarize( 8094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez const hash_map<AllocationContext, AllocationMetrics>& metrics_by_context); 8194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 8294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez private: 8394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Inserts an |Entry| for |Bucket| into |entries_|. Returns false if the 8494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // entry was present before, true if it was not. 8594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez bool AddEntryForBucket(const Bucket& bucket); 8694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 8794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Recursively breaks down a bucket into smaller buckets and adds entries for 8894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // the buckets worth dumping to |entries_|. 8994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez void BreakDown(const Bucket& bucket); 9094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // The collection of entries that is filled by |Summarize|. 9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::set<Entry> entries_; 9394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Helper for generating the |stackFrames| dictionary. Not owned, must outlive 9594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // this heap dump writer instance. 9694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez StackFrameDeduplicator* const stack_frame_deduplicator_; 9794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Helper for converting type names to IDs. Not owned, must outlive this heap 9994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // dump writer instance. 10094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TypeNameDeduplicator* const type_name_deduplicator_; 10194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // Minimum size of an allocation for which an allocation bucket will be 10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez // broken down with children. 10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez uint32_t breakdown_threshold_bytes_; 10594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez DISALLOW_COPY_AND_ASSIGN(HeapDumpWriter); 10794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez}; 10894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} // namespace internal 11094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} // namespace trace_event 11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} // namespace base 11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif // BASE_TRACE_EVENT_HEAP_PROFILER_HEAP_DUMP_WRITER_H_ 114