Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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_DEBUG_ACTIVITY_ANALYZER_H_ | 5 #ifndef BASE_DEBUG_ACTIVITY_ANALYZER_H_ |
| 6 #define BASE_DEBUG_ACTIVITY_ANALYZER_H_ | 6 #define BASE_DEBUG_ACTIVITY_ANALYZER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <set> | 10 #include <set> |
| 11 #include <string> | 11 #include <string> |
| 12 #include <vector> | |
| 12 | 13 |
| 13 #include "base/base_export.h" | 14 #include "base/base_export.h" |
| 14 #include "base/debug/activity_tracker.h" | 15 #include "base/debug/activity_tracker.h" |
| 15 | 16 |
| 16 namespace base { | 17 namespace base { |
| 17 namespace debug { | 18 namespace debug { |
| 18 | 19 |
| 19 class GlobalActivityAnalyzer; | 20 class GlobalActivityAnalyzer; |
| 20 | 21 |
| 21 // This class provides analysis of data captured from a ThreadActivityTracker. | 22 // This class provides analysis of data captured from a ThreadActivityTracker. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 | 71 |
| 71 ~ThreadActivityAnalyzer(); | 72 ~ThreadActivityAnalyzer(); |
| 72 | 73 |
| 73 // Adds information from the global analyzer. | 74 // Adds information from the global analyzer. |
| 74 void AddGlobalInformation(GlobalActivityAnalyzer* global); | 75 void AddGlobalInformation(GlobalActivityAnalyzer* global); |
| 75 | 76 |
| 76 // Returns true iff the contained data is valid. Results from all other | 77 // Returns true iff the contained data is valid. Results from all other |
| 77 // methods are undefined if this returns false. | 78 // methods are undefined if this returns false. |
| 78 bool IsValid() { return activity_snapshot_valid_; } | 79 bool IsValid() { return activity_snapshot_valid_; } |
| 79 | 80 |
| 81 // Gets the process id and its creation stamp. | |
| 82 int64_t GetProcessId(int64_t* out_stamp = nullptr) { | |
| 83 if (out_stamp) | |
| 84 *out_stamp = activity_snapshot_.create_stamp; | |
| 85 return activity_snapshot_.process_id; | |
| 86 } | |
| 87 | |
| 80 // Gets the name of the thread. | 88 // Gets the name of the thread. |
| 81 const std::string& GetThreadName() { | 89 const std::string& GetThreadName() { |
| 82 return activity_snapshot_.thread_name; | 90 return activity_snapshot_.thread_name; |
| 83 } | 91 } |
| 84 | 92 |
| 85 // Gets the TheadKey for this thread. | 93 // Gets the TheadKey for this thread. |
| 86 ThreadKey GetThreadKey() { | 94 ThreadKey GetThreadKey() { |
| 87 return ThreadKey(activity_snapshot_.process_id, | 95 return ThreadKey(activity_snapshot_.process_id, |
| 88 activity_snapshot_.thread_id); | 96 activity_snapshot_.thread_id); |
| 89 } | 97 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 | 137 |
| 130 ~GlobalActivityAnalyzer(); | 138 ~GlobalActivityAnalyzer(); |
| 131 | 139 |
| 132 #if !defined(OS_NACL) | 140 #if !defined(OS_NACL) |
| 133 // Creates a global analyzer using the contents of a file given in | 141 // Creates a global analyzer using the contents of a file given in |
| 134 // |file_path|. | 142 // |file_path|. |
| 135 static std::unique_ptr<GlobalActivityAnalyzer> CreateWithFile( | 143 static std::unique_ptr<GlobalActivityAnalyzer> CreateWithFile( |
| 136 const FilePath& file_path); | 144 const FilePath& file_path); |
| 137 #endif // !defined(OS_NACL) | 145 #endif // !defined(OS_NACL) |
| 138 | 146 |
| 139 // Iterates over all known valid analyzers or returns null if there are no | 147 // Iterates over all known valid processes and returns their PIDs or zero if |
|
manzagop (departed)
2017/03/21 21:10:05
So... can zero be a valid pid? (just checking)
bcwhite
2017/03/29 22:00:51
No.
manzagop (departed)
2017/03/30 18:13:24
On windows it's a valid pid, but not one we'll hav
bcwhite
2017/03/30 22:20:51
Acknowledged.
| |
| 140 // more. Ownership stays with the global analyzer object and all existing | 148 // there are no more. Calls to GetFirstProcess() will perform a global |
| 141 // analyzer pointers are invalidated when GetFirstAnalyzer() is called. | 149 // snapshot in order to provide a relatively consistent state across the |
| 142 ThreadActivityAnalyzer* GetFirstAnalyzer(); | 150 // future calls to GetNextProcess() and GetFirst/NextAnalyzer(). |
| 143 ThreadActivityAnalyzer* GetNextAnalyzer(); | 151 int64_t GetFirstProcess(); |
| 152 int64_t GetNextProcess(); | |
| 153 | |
| 154 // Iterates over all known valid analyzers for the a given process or returns | |
| 155 // null if there are no more. | |
| 156 // | |
| 157 // GetFirstProcess() must be called first in order to capture a global | |
| 158 // snapshot! Ownership stays with the global analyzer object and all existing | |
| 159 // analyzer pointers are invalidated when GetFirstProcess() is called. | |
|
manzagop (departed)
2017/03/21 21:10:05
May be worth mentioning GetNextAnalyzer calls for
bcwhite
2017/03/29 22:00:51
Better to get rid of the parameter altogether so i
| |
| 160 ThreadActivityAnalyzer* GetFirstAnalyzer(int64_t pid); | |
| 161 ThreadActivityAnalyzer* GetNextAnalyzer(int64_t pid); | |
| 144 | 162 |
| 145 // Gets the analyzer for a specific thread or null if there is none. | 163 // Gets the analyzer for a specific thread or null if there is none. |
| 146 // Ownership stays with the global analyzer object. | 164 // Ownership stays with the global analyzer object. |
| 147 ThreadActivityAnalyzer* GetAnalyzerForThread(const ThreadKey& key); | 165 ThreadActivityAnalyzer* GetAnalyzerForThread(const ThreadKey& key); |
| 148 | 166 |
| 149 // Extract user data based on a reference and its identifier. | 167 // Extract user data based on a reference and its identifier. |
| 150 ActivityUserData::Snapshot GetUserDataSnapshot(uint32_t ref, uint32_t id); | 168 ActivityUserData::Snapshot GetUserDataSnapshot(int64_t pid, |
| 169 uint32_t ref, | |
| 170 uint32_t id); | |
| 151 | 171 |
| 152 // Extract the global user data. | 172 // Extract the data for a specific process. An empty snapshot will be |
| 153 ActivityUserData::Snapshot GetGlobalUserDataSnapshot(); | 173 // returned if the process is not known. |
| 174 const ActivityUserData::Snapshot& GetProcessDataSnapshot(int64_t pid); | |
| 175 | |
| 176 // Extract the global data. | |
| 177 const ActivityUserData::Snapshot& GetGlobalDataSnapshot(); | |
| 154 | 178 |
| 155 // Gets all log messages stored within. | 179 // Gets all log messages stored within. |
| 156 std::vector<std::string> GetLogMessages(); | 180 std::vector<std::string> GetLogMessages(); |
| 157 | 181 |
| 158 // Gets all the known modules. | 182 // Gets all the known modules. |
| 159 std::vector<GlobalActivityTracker::ModuleInfo> GetModules(); | 183 std::vector<GlobalActivityTracker::ModuleInfo> GetModules(); |
| 160 | 184 |
| 161 // Gets the corresponding "program location" for a given "program counter". | 185 // Gets the corresponding "program location" for a given "program counter". |
| 162 // This will return {0,0} if no mapping could be found. | 186 // This will return {0,0} if no mapping could be found. |
| 163 ProgramLocation GetProgramLocationFromAddress(uint64_t address); | 187 ProgramLocation GetProgramLocationFromAddress(uint64_t address); |
| 164 | 188 |
| 165 private: | 189 private: |
| 166 using AnalyzerMap = | 190 using AnalyzerMap = |
| 167 std::map<ThreadKey, std::unique_ptr<ThreadActivityAnalyzer>>; | 191 std::map<ThreadKey, std::unique_ptr<ThreadActivityAnalyzer>>; |
| 168 | 192 |
| 193 struct UserDataSnapshot { | |
| 194 // Complex class needs out-of-line ctor/dtor. | |
| 195 UserDataSnapshot(); | |
| 196 UserDataSnapshot(const UserDataSnapshot& rhs); | |
| 197 UserDataSnapshot(UserDataSnapshot&& rhs); | |
| 198 ~UserDataSnapshot(); | |
| 199 | |
| 200 int64_t process_id; | |
| 201 int64_t create_stamp; | |
| 202 ActivityUserData::Snapshot data; | |
| 203 }; | |
| 204 | |
| 169 // Finds, creates, and indexes analyzers for all known processes and threads. | 205 // Finds, creates, and indexes analyzers for all known processes and threads. |
| 170 void PrepareAllAnalyzers(); | 206 void PrepareAllAnalyzers(); |
| 171 | 207 |
| 172 // The persistent memory allocator holding all tracking data. | 208 // The persistent memory allocator holding all tracking data. |
| 173 std::unique_ptr<PersistentMemoryAllocator> allocator_; | 209 std::unique_ptr<PersistentMemoryAllocator> allocator_; |
| 174 | 210 |
| 211 // The time stamp when analysis began. This is used to prevent looking into | |
| 212 // process IDs that get reused when analyzing a live system. | |
| 213 int64_t analysis_stamp_; | |
| 214 | |
| 175 // The iterator for finding tracking information in the allocator. | 215 // The iterator for finding tracking information in the allocator. |
| 176 PersistentMemoryAllocator::Iterator allocator_iterator_; | 216 PersistentMemoryAllocator::Iterator allocator_iterator_; |
| 177 | 217 |
| 178 // A set of all tracker memory references found within the allocator. | 218 // A set of all interesting memory references found within the allocator. |
| 179 std::set<PersistentMemoryAllocator::Reference> tracker_references_; | 219 std::set<PersistentMemoryAllocator::Reference> memory_references_; |
| 220 | |
| 221 // A set of all process-data memory references found within the allocator. | |
| 222 std::map<int64_t, UserDataSnapshot> process_data_; | |
| 223 | |
| 224 // A set of all known process IDs. | |
|
manzagop (departed)
2017/03/21 21:10:05
Looks like this empties itself as we iterate over
bcwhite
2017/03/29 22:00:51
Done.
| |
| 225 std::vector<int64_t> process_ids_; | |
| 180 | 226 |
| 181 // A map, keyed by ThreadKey, of all valid activity analyzers. | 227 // A map, keyed by ThreadKey, of all valid activity analyzers. |
| 182 AnalyzerMap analyzers_; | 228 AnalyzerMap analyzers_; |
| 183 | 229 |
| 184 // The iterator within the analyzers_ map for returning analyzers through | 230 // The iterator within the analyzers_ map for returning analyzers through |
| 185 // first/next iteration. | 231 // first/next iteration. |
| 186 AnalyzerMap::iterator analyzers_iterator_; | 232 AnalyzerMap::iterator analyzers_iterator_; |
| 187 | 233 |
| 234 // Snapshot of the global data. | |
| 235 ActivityUserData::Snapshot global_data_snapshot_; | |
| 236 | |
| 188 DISALLOW_COPY_AND_ASSIGN(GlobalActivityAnalyzer); | 237 DISALLOW_COPY_AND_ASSIGN(GlobalActivityAnalyzer); |
| 189 }; | 238 }; |
| 190 | 239 |
| 191 } // namespace debug | 240 } // namespace debug |
| 192 } // namespace base | 241 } // namespace base |
| 193 | 242 |
| 194 #endif // BASE_DEBUG_ACTIVITY_ANALYZER_H_ | 243 #endif // BASE_DEBUG_ACTIVITY_ANALYZER_H_ |
| OLD | NEW |