Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef BASE_DEEP_HEAP_PROFILE_H_ | |
| 6 #define BASE_DEEP_HEAP_PROFILE_H_ | |
| 7 | |
| 8 #include <config.h> | |
| 9 | |
| 10 #if defined(__linux__) | |
| 11 #define DEEP_HEAP_PROFILE 1 | |
|
Alexander Potapenko
2011/12/20 13:57:23
What does your code do if DEEP_HEAP_PROFILE is 0?
Dai Mikurube (NOT FULLTIME)
2011/12/21 09:13:49
If 0, only the constructor, the destructor and Fil
| |
| 12 #endif | |
| 13 | |
| 14 #include "addressmap-inl.h" | |
| 15 #include "heap-profile-table.h" | |
| 16 | |
| 17 class DeepHeapProfile { | |
| 18 public: | |
| 19 typedef HeapProfileTable::Bucket Bucket; | |
| 20 typedef HeapProfileTable::AllocationMap AllocationMap; | |
| 21 typedef HeapProfileTable::AllocValue AllocValue; | |
| 22 typedef HeapProfileTable::Stats Stats; | |
| 23 | |
| 24 DeepHeapProfile(HeapProfileTable* heap_profile, const char* prefix); | |
| 25 ~DeepHeapProfile(); | |
| 26 | |
| 27 // This replaces the same function in heap-profile-table.h | |
| 28 int FillOrderedProfile(char buf[], int size); | |
| 29 | |
| 30 private: | |
| 31 #ifdef DEEP_HEAP_PROFILE | |
| 32 struct DeepBucket { | |
| 33 Bucket* bucket; | |
| 34 int64 committed_size; | |
| 35 int id; // Unique ID of the bucket | |
| 36 bool is_logged; // True if the stracktrace is logged to a file | |
| 37 }; | |
| 38 | |
| 39 typedef AddressMap<DeepBucket> DeepBucketMap; | |
| 40 | |
| 41 struct PageState { | |
| 42 bool is_committed; // Currently, we use only this | |
| 43 bool is_present; | |
| 44 bool is_swapped; | |
| 45 bool is_shared; | |
| 46 bool is_mmap; | |
| 47 }; | |
| 48 | |
| 49 typedef AddressMap<PageState> PageStateMap; | |
| 50 | |
| 51 // This represents a single line of /proc/self/maps | |
| 52 struct RegionValue { | |
| 53 uint64 start; | |
| 54 uint64 end; | |
| 55 uint64 size; | |
| 56 uint64 committed_size; | |
| 57 uint64 recorded_size; | |
| 58 uint64 recorded_committed_size; | |
| 59 char permissions[5]; | |
| 60 char filename[1000]; | |
| 61 }; | |
| 62 | |
| 63 typedef AddressMap<RegionValue> RegionMap; | |
| 64 | |
| 65 struct RegionStats { | |
| 66 int64 virtual_bytes; | |
| 67 int64 committed_bytes; | |
| 68 }; | |
| 69 | |
| 70 struct GlobalStats { | |
| 71 RegionStats total; | |
| 72 RegionStats file_mapped; | |
| 73 RegionStats anonymous; | |
| 74 RegionStats other; | |
| 75 RegionStats record_mmap; | |
| 76 RegionStats record_tcmalloc; | |
| 77 }; | |
| 78 | |
| 79 struct BufferArgs { | |
| 80 char* buf; | |
| 81 int size; | |
| 82 int len; | |
| 83 }; | |
| 84 | |
| 85 DeepBucket* GetDeepBucket(Bucket* bucket); | |
| 86 void ResetCommittedSize(Bucket** table); | |
| 87 int FillBucketTable(Bucket** table, char buf[], int size, int bucket_length, | |
| 88 HeapProfileTable::Stats* stats); | |
| 89 | |
| 90 // Functions for opening, seeking, reading /proc/pid/pagemap | |
| 91 void OpenProcPagemap(); | |
| 92 bool SeekProcPagemap(uint64 addr); | |
| 93 bool ReadProcPagemap(PageState* state); | |
| 94 uint64 GetCommittedSize(uint64 addr, uint64 size); | |
| 95 | |
| 96 void InitRegionStats(RegionStats* stats); | |
| 97 void RecordRegionStats(uint64 start, uint64 end, RegionStats* stats); | |
| 98 void GetGlobalStats(); | |
| 99 static size_t GetRegionSize(const RegionValue& rv) { return rv.size; } | |
| 100 | |
| 101 // Record the committed memory size of each allocations | |
| 102 static void RecordAlloc(const void* ptr, AllocValue* v, | |
| 103 DeepHeapProfile* deep_profile); | |
| 104 static void RecordMMap(const void* ptr, AllocValue* v, | |
| 105 DeepHeapProfile* deep_profile); | |
| 106 void RecordAllAllocs(); | |
| 107 | |
| 108 void WriteMapsToFile(char buf[], int size); | |
| 109 | |
| 110 int FillBucketForBucketFile(const DeepBucket* db, char buf[], int bufsize); | |
| 111 void WriteBucketsTableToBucketFile(Bucket** table, RawFD bucket_fd); | |
| 112 void WriteBucketsToBucketFile(); | |
| 113 | |
| 114 static int UnparseBucket(const DeepBucket& b, | |
| 115 char* buf, int buflen, int bufsize, | |
| 116 const char* extra, | |
| 117 Stats* profile_stats); | |
| 118 | |
| 119 static int UnparseRegionStats(const RegionStats* stats, const char* name, | |
| 120 char* buf, int buflen, int bufsize); | |
| 121 | |
| 122 int UnparseGlobalStats(char* buf, int buflen, int bufsize); | |
| 123 | |
| 124 #endif // DEEP_HEAP_PROFILE | |
| 125 HeapProfileTable* heap_profile_; | |
| 126 #ifdef DEEP_HEAP_PROFILE | |
| 127 | |
| 128 int pagemap_fd_; // File descriptor of /proc/self/pagemap | |
| 129 pid_t most_recent_pid_; // Process ID of the last dump. This could change. | |
| 130 GlobalStats stats_; // Stats about total memory | |
| 131 PageStateMap* page_map_; // Map for holding status of allocations in page | |
| 132 int dump_count_; // The number of dumps | |
| 133 char* filename_prefix_; // Output file prefix | |
| 134 char* profiler_buffer_; // Buffer we use many times | |
| 135 | |
| 136 int bucket_id_; | |
| 137 DeepBucketMap* deep_bucket_map_; | |
| 138 #endif // DEEP_HEAP_PROFILE | |
| 139 }; | |
| 140 | |
| 141 #endif // BASE_DEEP_HEAP_PROFILE_H_ | |
| OLD | NEW |