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 // Activity tracking provides a low-overhead method of collecting information | 5 // Activity tracking provides a low-overhead method of collecting information |
6 // about the state of the application for analysis both while it is running | 6 // about the state of the application for analysis both while it is running |
7 // and after it has terminated unexpectedly. Its primary purpose is to help | 7 // and after it has terminated unexpectedly. Its primary purpose is to help |
8 // locate reasons the browser becomes unresponsive by providing insight into | 8 // locate reasons the browser becomes unresponsive by providing insight into |
9 // what all the various threads and processes are (or were) doing. | 9 // what all the various threads and processes are (or were) doing. |
10 | 10 |
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 // identified during extraction; the first 4 bytes of the SHA1 of the name | 757 // identified during extraction; the first 4 bytes of the SHA1 of the name |
758 // is used as a unique integer. A "version number" is added to the base | 758 // is used as a unique integer. A "version number" is added to the base |
759 // so that, if the structure of that object changes, stored older versions | 759 // so that, if the structure of that object changes, stored older versions |
760 // will be safely ignored. These are public so that an external process | 760 // will be safely ignored. These are public so that an external process |
761 // can recognize records of this type within an allocator. | 761 // can recognize records of this type within an allocator. |
762 enum : uint32_t { | 762 enum : uint32_t { |
763 kTypeIdActivityTracker = 0x5D7381AF + 4, // SHA1(ActivityTracker) v4 | 763 kTypeIdActivityTracker = 0x5D7381AF + 4, // SHA1(ActivityTracker) v4 |
764 kTypeIdUserDataRecord = 0x615EDDD7 + 3, // SHA1(UserDataRecord) v3 | 764 kTypeIdUserDataRecord = 0x615EDDD7 + 3, // SHA1(UserDataRecord) v3 |
765 kTypeIdGlobalLogMessage = 0x4CF434F9 + 1, // SHA1(GlobalLogMessage) v1 | 765 kTypeIdGlobalLogMessage = 0x4CF434F9 + 1, // SHA1(GlobalLogMessage) v1 |
766 kTypeIdProcessDataRecord = kTypeIdUserDataRecord + 0x100, | 766 kTypeIdProcessDataRecord = kTypeIdUserDataRecord + 0x100, |
767 kTypeIdGlobalDataRecord = kTypeIdUserDataRecord + 0x200, | |
768 | 767 |
769 kTypeIdActivityTrackerFree = ~kTypeIdActivityTracker, | 768 kTypeIdActivityTrackerFree = ~kTypeIdActivityTracker, |
770 kTypeIdUserDataRecordFree = ~kTypeIdUserDataRecord, | 769 kTypeIdUserDataRecordFree = ~kTypeIdUserDataRecord, |
771 kTypeIdProcessDataRecordFree = ~kTypeIdProcessDataRecord, | 770 kTypeIdProcessDataRecordFree = ~kTypeIdProcessDataRecord, |
772 }; | 771 }; |
773 | 772 |
774 // An enumeration of common process life stages. All entries are given an | 773 // An enumeration of common process life stages. All entries are given an |
775 // explicit number so they are known and remain constant; this allows for | 774 // explicit number so they are known and remain constant; this allows for |
776 // cross-version analysis either locally or on a server. | 775 // cross-version analysis either locally or on a server. |
777 enum ProcessPhase : int { | 776 enum ProcessPhase : int { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 // many times a module may be loaded and unloaded. | 818 // many times a module may be loaded and unloaded. |
820 size_t size = 0; // The size of the loaded module. | 819 size_t size = 0; // The size of the loaded module. |
821 uint32_t timestamp = 0; // Opaque "timestamp" for the module. | 820 uint32_t timestamp = 0; // Opaque "timestamp" for the module. |
822 uint32_t age = 0; // Opaque "age" for the module. | 821 uint32_t age = 0; // Opaque "age" for the module. |
823 uint8_t identifier[16]; // Opaque identifier (GUID, etc.) for the module. | 822 uint8_t identifier[16]; // Opaque identifier (GUID, etc.) for the module. |
824 std::string file; // The full path to the file. (UTF-8) | 823 std::string file; // The full path to the file. (UTF-8) |
825 std::string debug_file; // The full path to the debug file. | 824 std::string debug_file; // The full path to the debug file. |
826 }; | 825 }; |
827 | 826 |
828 // This is a thin wrapper around the thread-tracker's ScopedActivity that | 827 // This is a thin wrapper around the thread-tracker's ScopedActivity that |
829 // accesses the global tracker to provide some of the information, notably | 828 // allows thread-safe access to data values. It is safe to use even if |
830 // which thread-tracker to use. It is safe to create even if activity | 829 // activity tracking is not enabled. |
831 // tracking is not enabled. | |
832 class BASE_EXPORT ScopedThreadActivity | 830 class BASE_EXPORT ScopedThreadActivity |
833 : public ThreadActivityTracker::ScopedActivity { | 831 : public ThreadActivityTracker::ScopedActivity { |
834 public: | 832 public: |
835 ScopedThreadActivity(const void* program_counter, | 833 ScopedThreadActivity(const void* program_counter, |
836 const void* origin, | 834 const void* origin, |
837 Activity::Type type, | 835 Activity::Type type, |
838 const ActivityData& data, | 836 const ActivityData& data, |
839 bool lock_allowed); | 837 bool lock_allowed); |
840 ~ScopedThreadActivity(); | 838 ~ScopedThreadActivity(); |
841 | 839 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 } | 1023 } |
1026 | 1024 |
1027 // Gets the process ID used for tracking. This is typically the same as what | 1025 // Gets the process ID used for tracking. This is typically the same as what |
1028 // the OS thinks is the current process but can be overridden for testing. | 1026 // the OS thinks is the current process but can be overridden for testing. |
1029 int64_t process_id() { return process_id_; }; | 1027 int64_t process_id() { return process_id_; }; |
1030 | 1028 |
1031 // Accesses the process data record for storing arbitrary key/value pairs. | 1029 // Accesses the process data record for storing arbitrary key/value pairs. |
1032 // Updates to this are thread-safe. | 1030 // Updates to this are thread-safe. |
1033 ActivityUserData& process_data() { return process_data_; } | 1031 ActivityUserData& process_data() { return process_data_; } |
1034 | 1032 |
1035 // Accesses the global data record for storing arbitrary key/value pairs. | |
1036 // Updates to this are thread-safe. | |
1037 ActivityUserData& global_data() { return global_data_; } | |
1038 | |
1039 private: | 1033 private: |
1040 friend class GlobalActivityAnalyzer; | 1034 friend class GlobalActivityAnalyzer; |
1041 friend class ScopedThreadActivity; | 1035 friend class ScopedThreadActivity; |
1042 friend class ActivityTrackerTest; | 1036 friend class ActivityTrackerTest; |
1043 | 1037 |
1044 enum : int { | 1038 enum : int { |
1045 // The maximum number of threads that can be tracked within a process. If | 1039 // The maximum number of threads that can be tracked within a process. If |
1046 // more than this number run concurrently, tracking of new ones may cease. | 1040 // more than this number run concurrently, tracking of new ones may cease. |
1047 kMaxThreadCount = 100, | 1041 kMaxThreadCount = 100, |
1048 kCachedThreadMemories = 10, | 1042 kCachedThreadMemories = 10, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 // A caching memory allocator for thread-tracker objects. | 1177 // A caching memory allocator for thread-tracker objects. |
1184 ActivityTrackerMemoryAllocator thread_tracker_allocator_; | 1178 ActivityTrackerMemoryAllocator thread_tracker_allocator_; |
1185 base::Lock thread_tracker_allocator_lock_; | 1179 base::Lock thread_tracker_allocator_lock_; |
1186 | 1180 |
1187 // A caching memory allocator for user data attached to activity data. | 1181 // A caching memory allocator for user data attached to activity data. |
1188 ActivityTrackerMemoryAllocator user_data_allocator_; | 1182 ActivityTrackerMemoryAllocator user_data_allocator_; |
1189 base::Lock user_data_allocator_lock_; | 1183 base::Lock user_data_allocator_lock_; |
1190 | 1184 |
1191 // An object for holding arbitrary key value pairs with thread-safe access. | 1185 // An object for holding arbitrary key value pairs with thread-safe access. |
1192 ThreadSafeUserData process_data_; | 1186 ThreadSafeUserData process_data_; |
1193 ThreadSafeUserData global_data_; | |
1194 | 1187 |
1195 // A map of global module information, keyed by module path. | 1188 // A map of global module information, keyed by module path. |
1196 std::map<const std::string, ModuleInfoRecord*> modules_; | 1189 std::map<const std::string, ModuleInfoRecord*> modules_; |
1197 base::Lock modules_lock_; | 1190 base::Lock modules_lock_; |
1198 | 1191 |
1199 // The active global activity tracker. | 1192 // The active global activity tracker. |
1200 static subtle::AtomicWord g_tracker_; | 1193 static subtle::AtomicWord g_tracker_; |
1201 | 1194 |
1202 // A lock that is used to protect access to the following fields. | 1195 // A lock that is used to protect access to the following fields. |
1203 base::Lock global_tracker_lock_; | 1196 base::Lock global_tracker_lock_; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 ScopedProcessWaitActivity(const void* program_counter, | 1334 ScopedProcessWaitActivity(const void* program_counter, |
1342 const base::Process* process); | 1335 const base::Process* process); |
1343 DISALLOW_COPY_AND_ASSIGN(ScopedProcessWaitActivity); | 1336 DISALLOW_COPY_AND_ASSIGN(ScopedProcessWaitActivity); |
1344 }; | 1337 }; |
1345 #endif | 1338 #endif |
1346 | 1339 |
1347 } // namespace debug | 1340 } // namespace debug |
1348 } // namespace base | 1341 } // namespace base |
1349 | 1342 |
1350 #endif // BASE_DEBUG_ACTIVITY_TRACKER_H_ | 1343 #endif // BASE_DEBUG_ACTIVITY_TRACKER_H_ |
OLD | NEW |