| 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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 // - the memory has been released back to the OS | 370 // - the memory has been released back to the OS |
| 371 // - the memory belongs to a different process's address space | 371 // - the memory belongs to a different process's address space |
| 372 // Dereferencing the returned StringPiece when the memory is not accessible | 372 // Dereferencing the returned StringPiece when the memory is not accessible |
| 373 // will cause the program to SEGV! | 373 // will cause the program to SEGV! |
| 374 StringPiece GetReference() const; | 374 StringPiece GetReference() const; |
| 375 StringPiece GetStringReference() const; | 375 StringPiece GetStringReference() const; |
| 376 | 376 |
| 377 private: | 377 private: |
| 378 friend class ActivityUserData; | 378 friend class ActivityUserData; |
| 379 | 379 |
| 380 ValueType type_; | 380 ValueType type_ = END_OF_VALUES; |
| 381 uint64_t short_value_; // Used to hold copy of numbers, etc. | 381 uint64_t short_value_; // Used to hold copy of numbers, etc. |
| 382 std::string long_value_; // Used to hold copy of raw/string data. | 382 std::string long_value_; // Used to hold copy of raw/string data. |
| 383 StringPiece ref_value_; // Used to hold reference to external data. | 383 StringPiece ref_value_; // Used to hold reference to external data. |
| 384 }; | 384 }; |
| 385 | 385 |
| 386 using Snapshot = std::map<std::string, TypedValue>; | 386 using Snapshot = std::map<std::string, TypedValue>; |
| 387 | 387 |
| 388 ActivityUserData(void* memory, size_t size); | 388 ActivityUserData(void* memory, size_t size); |
| 389 virtual ~ActivityUserData(); | 389 virtual ~ActivityUserData(); |
| 390 | 390 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 // of information. | 433 // of information. |
| 434 void SetReference(StringPiece name, const void* memory, size_t size) { | 434 void SetReference(StringPiece name, const void* memory, size_t size) { |
| 435 SetReference(name, RAW_VALUE_REFERENCE, memory, size); | 435 SetReference(name, RAW_VALUE_REFERENCE, memory, size); |
| 436 } | 436 } |
| 437 void SetStringReference(StringPiece name, StringPiece value) { | 437 void SetStringReference(StringPiece name, StringPiece value) { |
| 438 SetReference(name, STRING_VALUE_REFERENCE, value.data(), value.length()); | 438 SetReference(name, STRING_VALUE_REFERENCE, value.data(), value.length()); |
| 439 } | 439 } |
| 440 | 440 |
| 441 // Creates a snapshot of the key/value pairs contained within. The returned | 441 // Creates a snapshot of the key/value pairs contained within. The returned |
| 442 // data will be fixed, independent of whatever changes afterward. There is | 442 // data will be fixed, independent of whatever changes afterward. There is |
| 443 // protection against concurrent modification of the values but no protection | 443 // some protection against concurrent modification. This will return false |
| 444 // against a complete overwrite of the contents; the caller must ensure that | 444 // if the data is invalid or if a complete overwrite of the contents is |
| 445 // the memory segment is not going to be re-initialized while this runs. | 445 // detected. |
| 446 bool CreateSnapshot(Snapshot* output_snapshot) const; | 446 bool CreateSnapshot(Snapshot* output_snapshot) const; |
| 447 | 447 |
| 448 // Gets the base memory address used for storing data. | 448 // Gets the base memory address used for storing data. |
| 449 const void* GetBaseAddress() const; | 449 const void* GetBaseAddress() const; |
| 450 | 450 |
| 451 // Explicitly sets the process ID. | 451 // Explicitly sets the process ID. |
| 452 void SetOwningProcessIdForTesting(ProcessId pid, int64_t stamp); | 452 void SetOwningProcessIdForTesting(ProcessId pid, int64_t stamp); |
| 453 | 453 |
| 454 // Gets the associated process ID, in native form, and the creation timestamp | 454 // Gets the associated process ID, in native form, and the creation timestamp |
| 455 // from tracker memory without loading the entire structure for analysis. This | 455 // from tracker memory without loading the entire structure for analysis. This |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 | 524 |
| 525 // Information about the memory block in which new data can be stored. These | 525 // Information about the memory block in which new data can be stored. These |
| 526 // are "mutable" because they change even on "const" objects that are just | 526 // are "mutable" because they change even on "const" objects that are just |
| 527 // skipping already set values. | 527 // skipping already set values. |
| 528 mutable char* memory_; | 528 mutable char* memory_; |
| 529 mutable size_t available_; | 529 mutable size_t available_; |
| 530 | 530 |
| 531 // A pointer to the memory header for this instance. | 531 // A pointer to the memory header for this instance. |
| 532 MemoryHeader* const header_; | 532 MemoryHeader* const header_; |
| 533 | 533 |
| 534 // These hold values used when initially creating the object. They are |
| 535 // compared against current header values to check for outside changes. |
| 536 const uint32_t orig_data_id; |
| 537 const int64_t orig_process_id; |
| 538 const int64_t orig_create_stamp; |
| 539 |
| 534 DISALLOW_COPY_AND_ASSIGN(ActivityUserData); | 540 DISALLOW_COPY_AND_ASSIGN(ActivityUserData); |
| 535 }; | 541 }; |
| 536 | 542 |
| 537 // This class manages tracking a stack of activities for a single thread in | 543 // This class manages tracking a stack of activities for a single thread in |
| 538 // a persistent manner, implementing a bounded-size stack in a fixed-size | 544 // a persistent manner, implementing a bounded-size stack in a fixed-size |
| 539 // memory allocation. In order to support an operational mode where another | 545 // memory allocation. In order to support an operational mode where another |
| 540 // thread is analyzing this data in real-time, atomic operations are used | 546 // thread is analyzing this data in real-time, atomic operations are used |
| 541 // where necessary to guarantee a consistent view from the outside. | 547 // where necessary to guarantee a consistent view from the outside. |
| 542 // | 548 // |
| 543 // This class is not generally used directly but instead managed by the | 549 // This class is not generally used directly but instead managed by the |
| (...skipping 14 matching lines...) Expand all Loading... |
| 558 struct BASE_EXPORT Snapshot { | 564 struct BASE_EXPORT Snapshot { |
| 559 // Explicit constructor/destructor are needed because of complex types | 565 // Explicit constructor/destructor are needed because of complex types |
| 560 // with non-trivial default constructors and destructors. | 566 // with non-trivial default constructors and destructors. |
| 561 Snapshot(); | 567 Snapshot(); |
| 562 ~Snapshot(); | 568 ~Snapshot(); |
| 563 | 569 |
| 564 // The name of the thread as set when it was created. The name may be | 570 // The name of the thread as set when it was created. The name may be |
| 565 // truncated due to internal length limitations. | 571 // truncated due to internal length limitations. |
| 566 std::string thread_name; | 572 std::string thread_name; |
| 567 | 573 |
| 574 // The timestamp at which this process was created. |
| 575 int64_t create_stamp; |
| 576 |
| 568 // The process and thread IDs. These values have no meaning other than | 577 // The process and thread IDs. These values have no meaning other than |
| 569 // they uniquely identify a running process and a running thread within | 578 // they uniquely identify a running process and a running thread within |
| 570 // that process. Thread-IDs can be re-used across different processes | 579 // that process. Thread-IDs can be re-used across different processes |
| 571 // and both can be re-used after the process/thread exits. | 580 // and both can be re-used after the process/thread exits. |
| 572 int64_t process_id = 0; | 581 int64_t process_id = 0; |
| 573 int64_t thread_id = 0; | 582 int64_t thread_id = 0; |
| 574 | 583 |
| 575 // The current stack of activities that are underway for this thread. It | 584 // The current stack of activities that are underway for this thread. It |
| 576 // is limited in its maximum size with later entries being left off. | 585 // is limited in its maximum size with later entries being left off. |
| 577 std::vector<Activity> activity_stack; | 586 std::vector<Activity> activity_stack; |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 ScopedProcessWaitActivity(const void* program_counter, | 1270 ScopedProcessWaitActivity(const void* program_counter, |
| 1262 const base::Process* process); | 1271 const base::Process* process); |
| 1263 DISALLOW_COPY_AND_ASSIGN(ScopedProcessWaitActivity); | 1272 DISALLOW_COPY_AND_ASSIGN(ScopedProcessWaitActivity); |
| 1264 }; | 1273 }; |
| 1265 #endif | 1274 #endif |
| 1266 | 1275 |
| 1267 } // namespace debug | 1276 } // namespace debug |
| 1268 } // namespace base | 1277 } // namespace base |
| 1269 | 1278 |
| 1270 #endif // BASE_DEBUG_ACTIVITY_TRACKER_H_ | 1279 #endif // BASE_DEBUG_ACTIVITY_TRACKER_H_ |
| OLD | NEW |