Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(715)

Side by Side Diff: base/trace_event/heap_profiler_stack_frame_deduplicator.h

Issue 2650863003: [tracing] Switch to new heap dump format. (Closed)
Patch Set: Add 'version' field. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_ 5 #ifndef BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_
6 #define BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_ 6 #define BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/base_export.h" 12 #include "base/base_export.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/trace_event/heap_profiler_allocation_context.h" 14 #include "base/trace_event/heap_profiler_allocation_context.h"
15 #include "base/trace_event/trace_event_impl.h"
16 15
17 namespace base { 16 namespace base {
18 namespace trace_event { 17 namespace trace_event {
19 18
20 class TraceEventMemoryOverhead; 19 class TraceEventMemoryOverhead;
20 class TracedValue;
21 21
22 // A data structure that allows grouping a set of backtraces in a space- 22 // A data structure that allows grouping a set of backtraces in a space-
23 // efficient manner by creating a call tree and writing it as a set of (node, 23 // efficient manner by creating a call tree and writing it as a set of (node,
24 // parent) pairs. The tree nodes reference both parent and children. The parent 24 // parent) pairs. The tree nodes reference both parent and children. The parent
25 // is referenced by index into |frames_|. The children are referenced via a map 25 // is referenced by index into |frames_|. The children are referenced via a map
26 // of |StackFrame|s to index into |frames_|. So there is a trie for bottum-up 26 // of |StackFrame|s to index into |frames_|. So there is a trie for bottum-up
27 // lookup of a backtrace for deduplication, and a tree for compact storage in 27 // lookup of a backtrace for deduplication, and a tree for compact storage in
28 // the trace log. 28 // the trace log.
29 class BASE_EXPORT StackFrameDeduplicator : public ConvertableToTraceFormat { 29 class BASE_EXPORT StackFrameDeduplicator {
30 public: 30 public:
31 // A node in the call tree. 31 // A node in the call tree.
32 struct FrameNode { 32 struct FrameNode {
33 FrameNode(StackFrame frame, int parent_frame_index); 33 FrameNode(StackFrame frame, int parent_frame_index);
34 FrameNode(const FrameNode& other); 34 FrameNode(const FrameNode& other);
35 ~FrameNode(); 35 ~FrameNode();
36 36
37 size_t EstimateMemoryUsage() const; 37 size_t EstimateMemoryUsage() const;
38 38
39 StackFrame frame; 39 StackFrame frame;
40 40
41 // The index of the parent stack frame in |frames_|, or -1 if there is no 41 // The index of the parent stack frame in |frames_|, or -1 if there is no
42 // parent frame (when it is at the bottom of the call stack). 42 // parent frame (when it is at the bottom of the call stack).
43 int parent_frame_index; 43 int parent_frame_index;
44 44
45 // Indices into |frames_| of frames called from the current frame. 45 // Indices into |frames_| of frames called from the current frame.
46 std::map<StackFrame, int> children; 46 std::map<StackFrame, int> children;
47 }; 47 };
48 48
49 using ConstIterator = std::vector<FrameNode>::const_iterator; 49 using ConstIterator = std::vector<FrameNode>::const_iterator;
50 50
51 StackFrameDeduplicator(); 51 StackFrameDeduplicator();
52 ~StackFrameDeduplicator() override; 52 ~StackFrameDeduplicator();
53 53
54 // Inserts a backtrace where |beginFrame| is a pointer to the bottom frame 54 // Inserts a backtrace where |beginFrame| is a pointer to the bottom frame
55 // (e.g. main) and |endFrame| is a pointer past the top frame (most recently 55 // (e.g. main) and |endFrame| is a pointer past the top frame (most recently
56 // called function), and returns the index of its leaf node in |frames_|. 56 // called function), and returns the index of its leaf node in |frames_|.
57 // Returns -1 if the backtrace is empty. 57 // Returns -1 if the backtrace is empty.
58 int Insert(const StackFrame* beginFrame, const StackFrame* endFrame); 58 int Insert(const StackFrame* beginFrame, const StackFrame* endFrame);
59 59
60 // Iterators over the frame nodes in the call tree. 60 // Iterators over the frame nodes in the call tree.
61 ConstIterator begin() const { return frames_.begin(); } 61 ConstIterator begin() const { return frames_.begin(); }
62 ConstIterator end() const { return frames_.end(); } 62 ConstIterator end() const { return frames_.end(); }
63 63
64 // Writes the |stackFrames| dictionary as defined in https://goo.gl/GerkV8 to 64 // Appends new |stackFrames| dictionary items that were added after the
65 // the trace log. 65 // last call to this function.
66 void AppendAsTraceFormat(std::string* out) const override; 66 // Items are formatted according to https://goo.gl/GerkV8
67 void AppendIncrementally(TracedValue* traced_value);
67 68
68 // Estimates memory overhead including |sizeof(StackFrameDeduplicator)|. 69 // Estimates memory overhead including |sizeof(StackFrameDeduplicator)|.
69 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead) override; 70 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
70 71
71 private: 72 private:
72 std::map<StackFrame, int> roots_; 73 std::map<StackFrame, int> roots_;
73 std::vector<FrameNode> frames_; 74 std::vector<FrameNode> frames_;
75 size_t last_appended_index_;
74 76
75 DISALLOW_COPY_AND_ASSIGN(StackFrameDeduplicator); 77 DISALLOW_COPY_AND_ASSIGN(StackFrameDeduplicator);
76 }; 78 };
77 79
78 } // namespace trace_event 80 } // namespace trace_event
79 } // namespace base 81 } // namespace base
80 82
81 #endif // BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_ 83 #endif // BASE_TRACE_EVENT_HEAP_PROFILER_STACK_FRAME_DEDUPLICATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698