123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368 |
- #ifndef BASE_DEBUG_ACTIVITY_TRACKER_H_
- #define BASE_DEBUG_ACTIVITY_TRACKER_H_
- #include <atomic>
- #include <map>
- #include <memory>
- #include <string>
- #include <vector>
- #include "base/atomicops.h"
- #include "base/base_export.h"
- #include "base/callback.h"
- #include "base/compiler_specific.h"
- #include "base/gtest_prod_util.h"
- #include "base/location.h"
- #include "base/memory/shared_memory_mapping.h"
- #include "base/metrics/persistent_memory_allocator.h"
- #include "base/process/process_handle.h"
- #include "base/sequenced_task_runner.h"
- #include "base/strings/string_piece.h"
- #include "base/strings/utf_string_conversions.h"
- #include "base/threading/platform_thread.h"
- #include "base/threading/thread_local.h"
- namespace base {
- struct PendingTask;
- class FilePath;
- class Lock;
- class PlatformThreadHandle;
- class Process;
- class WaitableEvent;
- namespace debug {
- class ThreadActivityTracker;
- enum : int {
-
-
-
- kActivityCallStackSize = 10,
- };
- struct OwningProcess {
- OwningProcess();
- ~OwningProcess();
-
-
-
- void Release_Initialize(int64_t pid = 0);
-
- void SetOwningProcessIdForTesting(int64_t pid, int64_t stamp);
-
-
-
- static bool GetOwningProcessId(const void* memory,
- int64_t* out_id,
- int64_t* out_stamp);
-
- static constexpr uint32_t kPersistentTypeId = 0xB1179672 + 1;
-
- static constexpr size_t kExpectedInstanceSize = 24;
- std::atomic<uint32_t> data_id;
- uint32_t padding;
- int64_t process_id;
- int64_t create_stamp;
- };
- union ActivityData {
-
-
-
-
- struct {
- uint32_t id;
- int32_t info;
- } generic;
- struct {
- uint64_t sequence_id;
- } task;
- struct {
- uint64_t lock_address;
- } lock;
- struct {
- uint64_t event_address;
- } event;
- struct {
- int64_t thread_id;
- } thread;
- struct {
- int64_t process_id;
- } process;
- struct {
- uint32_t code;
- } exception;
-
-
-
-
-
-
- static ActivityData ForGeneric(uint32_t id, int32_t info) {
- ActivityData data;
- data.generic.id = id;
- data.generic.info = info;
- return data;
- }
- static ActivityData ForTask(uint64_t sequence) {
- ActivityData data;
- data.task.sequence_id = sequence;
- return data;
- }
- static ActivityData ForLock(const void* lock) {
- ActivityData data;
- data.lock.lock_address = reinterpret_cast<uintptr_t>(lock);
- return data;
- }
- static ActivityData ForEvent(const void* event) {
- ActivityData data;
- data.event.event_address = reinterpret_cast<uintptr_t>(event);
- return data;
- }
- static ActivityData ForThread(const PlatformThreadHandle& handle);
- static ActivityData ForThread(const int64_t id) {
- ActivityData data;
- data.thread.thread_id = id;
- return data;
- }
- static ActivityData ForProcess(const int64_t id) {
- ActivityData data;
- data.process.process_id = id;
- return data;
- }
- static ActivityData ForException(const uint32_t code) {
- ActivityData data;
- data.exception.code = code;
- return data;
- }
- };
- extern const ActivityData kNullActivityData;
- class BASE_EXPORT ActivityTrackerMemoryAllocator {
- public:
- using Reference = PersistentMemoryAllocator::Reference;
-
-
-
-
-
- ActivityTrackerMemoryAllocator(PersistentMemoryAllocator* allocator,
- uint32_t object_type,
- uint32_t object_free_type,
- size_t object_size,
- size_t cache_size,
- bool make_iterable);
- ~ActivityTrackerMemoryAllocator();
-
-
- Reference GetObjectReference();
-
- void ReleaseObjectReference(Reference ref);
-
- template <typename T>
- T* GetAsObject(Reference ref) {
- return allocator_->GetAsObject<T>(ref);
- }
-
- template <typename T>
- T* GetAsArray(Reference ref, size_t count) {
- return allocator_->GetAsArray<T>(ref, object_type_, count);
- }
-
- size_t cache_used() const { return cache_used_; }
- private:
- PersistentMemoryAllocator* const allocator_;
- const uint32_t object_type_;
- const uint32_t object_free_type_;
- const size_t object_size_;
- const size_t cache_size_;
- const bool make_iterable_;
-
- PersistentMemoryAllocator::Iterator iterator_;
-
- std::unique_ptr<Reference[]> cache_values_;
- size_t cache_used_;
- DISALLOW_COPY_AND_ASSIGN(ActivityTrackerMemoryAllocator);
- };
- struct Activity {
-
- static constexpr uint32_t kPersistentTypeId = 0x99425159 + 1;
-
- static constexpr size_t kExpectedInstanceSize =
- 48 + 8 * kActivityCallStackSize;
-
-
-
-
- enum Type : uint8_t {
-
- ACT_NULL = 0,
-
-
- ACT_TASK = 1 << 4,
- ACT_TASK_RUN = ACT_TASK,
-
- ACT_LOCK = 2 << 4,
- ACT_LOCK_ACQUIRE = ACT_LOCK,
- ACT_LOCK_RELEASE,
-
- ACT_EVENT = 3 << 4,
- ACT_EVENT_WAIT = ACT_EVENT,
- ACT_EVENT_SIGNAL,
-
- ACT_THREAD = 4 << 4,
- ACT_THREAD_START = ACT_THREAD,
- ACT_THREAD_JOIN,
-
- ACT_PROCESS = 5 << 4,
- ACT_PROCESS_START = ACT_PROCESS,
- ACT_PROCESS_WAIT,
-
- ACT_EXCEPTION = 14 << 4,
-
- ACT_GENERIC = 15 << 4,
-
-
- ACT_CATEGORY_MASK = 0xF << 4,
- ACT_ACTION_MASK = 0xF
- };
-
-
- int64_t time_internal;
-
- uint64_t calling_address;
-
-
-
-
- uint64_t origin_address;
-
-
-
-
-
- uint64_t call_stack[kActivityCallStackSize];
-
-
- uint32_t user_data_ref;
- uint32_t user_data_id;
-
-
- uint8_t activity_type;
-
-
-
- uint8_t padding[7];
-
- ActivityData data;
- static void FillFrom(Activity* activity,
- const void* program_counter,
- const void* origin,
- Type type,
- const ActivityData& data);
- };
- class BASE_EXPORT ActivityUserData {
- public:
-
-
- enum ValueType : uint8_t {
- END_OF_VALUES = 0,
- RAW_VALUE,
- RAW_VALUE_REFERENCE,
- STRING_VALUE,
- STRING_VALUE_REFERENCE,
- CHAR_VALUE,
- BOOL_VALUE,
- SIGNED_VALUE,
- UNSIGNED_VALUE,
- };
- class BASE_EXPORT TypedValue {
- public:
- TypedValue();
- TypedValue(const TypedValue& other);
- ~TypedValue();
- ValueType type() const { return type_; }
-
- StringPiece Get() const;
- StringPiece GetString() const;
- bool GetBool() const;
- char GetChar() const;
- int64_t GetInt() const;
- uint64_t GetUint() const;
-
-
-
-
-
-
-
-
- StringPiece GetReference() const;
- StringPiece GetStringReference() const;
- private:
- friend class ActivityUserData;
- ValueType type_ = END_OF_VALUES;
- uint64_t short_value_;
- std::string long_value_;
- StringPiece ref_value_;
- };
- using Snapshot = std::map<std::string, TypedValue>;
-
-
- ActivityUserData();
- ActivityUserData(void* memory, size_t size, int64_t pid = 0);
- virtual ~ActivityUserData();
-
-
-
- uint32_t id() const {
- return header_ ? header_->owner.data_id.load(std::memory_order_relaxed) : 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void Set(StringPiece name, const void* memory, size_t size) {
- Set(name, RAW_VALUE, memory, size);
- }
- void SetString(StringPiece name, StringPiece value) {
- Set(name, STRING_VALUE, value.data(), value.length());
- }
- void SetString(StringPiece name, StringPiece16 value) {
- SetString(name, UTF16ToUTF8(value));
- }
- std::atomic<bool>* SetBool(StringPiece name, bool value) {
- char cvalue = value ? 1 : 0;
- void* addr = Set(name, BOOL_VALUE, &cvalue, sizeof(cvalue));
- return reinterpret_cast<std::atomic<bool>*>(addr);
- }
- std::atomic<char>* SetChar(StringPiece name, char value) {
- void* addr = Set(name, CHAR_VALUE, &value, sizeof(value));
- return reinterpret_cast<std::atomic<char>*>(addr);
- }
- std::atomic<int64_t>* SetInt(StringPiece name, int64_t value) {
- void* addr = Set(name, SIGNED_VALUE, &value, sizeof(value));
- return reinterpret_cast<std::atomic<int64_t>*>(addr);
- }
- std::atomic<uint64_t>* SetUint(StringPiece name, uint64_t value) {
- void* addr = Set(name, UNSIGNED_VALUE, &value, sizeof(value));
- return reinterpret_cast<std::atomic<uint64_t>*>(addr);
- }
-
-
-
-
- void SetReference(StringPiece name, const void* memory, size_t size) {
- SetReference(name, RAW_VALUE_REFERENCE, memory, size);
- }
- void SetStringReference(StringPiece name, StringPiece value) {
- SetReference(name, STRING_VALUE_REFERENCE, value.data(), value.length());
- }
-
-
-
-
-
- bool CreateSnapshot(Snapshot* output_snapshot) const;
-
- const void* GetBaseAddress() const;
-
- void SetOwningProcessIdForTesting(int64_t pid, int64_t stamp);
-
-
-
- static bool GetOwningProcessId(const void* memory,
- int64_t* out_id,
- int64_t* out_stamp);
- protected:
- virtual void* Set(StringPiece name,
- ValueType type,
- const void* memory,
- size_t size);
- private:
- FRIEND_TEST_ALL_PREFIXES(ActivityTrackerTest, UserDataTest);
- enum : size_t { kMemoryAlignment = sizeof(uint64_t) };
-
- struct MemoryHeader {
- MemoryHeader();
- ~MemoryHeader();
- OwningProcess owner;
- };
-
- struct FieldHeader {
- FieldHeader();
- ~FieldHeader();
- std::atomic<uint8_t> type;
- uint8_t name_size;
- std::atomic<uint16_t> value_size;
- uint16_t record_size;
- };
-
- struct ReferenceRecord {
- uint64_t address;
- uint64_t size;
- };
-
-
- struct ValueInfo {
- ValueInfo();
- ValueInfo(ValueInfo&&);
- ~ValueInfo();
- StringPiece name;
- ValueType type;
- void* memory;
- std::atomic<uint16_t>* size_ptr;
- size_t extent;
- };
- void SetReference(StringPiece name,
- ValueType type,
- const void* memory,
- size_t size);
-
-
-
-
-
- void ImportExistingData() const;
-
-
-
- mutable std::map<StringPiece, ValueInfo> values_;
-
-
-
- mutable char* memory_;
- mutable size_t available_;
-
- MemoryHeader* const header_;
-
-
- const uint32_t orig_data_id;
- const int64_t orig_process_id;
- const int64_t orig_create_stamp;
- DISALLOW_COPY_AND_ASSIGN(ActivityUserData);
- };
- class BASE_EXPORT ThreadActivityTracker {
- public:
- using ActivityId = uint32_t;
-
-
-
- struct Header;
-
-
-
- struct BASE_EXPORT Snapshot {
-
-
- Snapshot();
- ~Snapshot();
-
-
- std::string thread_name;
-
- int64_t create_stamp;
-
-
-
-
- int64_t process_id = 0;
- int64_t thread_id = 0;
-
-
- std::vector<Activity> activity_stack;
-
-
- uint32_t activity_stack_depth = 0;
-
- Activity last_exception;
- };
-
-
-
-
- class BASE_EXPORT ScopedActivity {
- public:
- ScopedActivity(ThreadActivityTracker* tracker,
- const void* program_counter,
- const void* origin,
- Activity::Type type,
- const ActivityData& data);
- ~ScopedActivity();
-
-
-
- bool IsRecorded();
-
- void ChangeTypeAndData(Activity::Type type, const ActivityData& data);
- protected:
-
-
- ThreadActivityTracker* const tracker_;
-
- ActivityId activity_id_;
- private:
- DISALLOW_COPY_AND_ASSIGN(ScopedActivity);
- };
-
-
-
- ThreadActivityTracker(void* base, size_t size);
- virtual ~ThreadActivityTracker();
-
-
-
-
-
- ActivityId PushActivity(const void* program_counter,
- const void* origin,
- Activity::Type type,
- const ActivityData& data);
-
-
- ALWAYS_INLINE
- ActivityId PushActivity(const void* origin,
- Activity::Type type,
- const ActivityData& data) {
- return PushActivity(GetProgramCounter(), origin, type, data);
- }
-
-
-
-
-
-
-
- void ChangeActivity(ActivityId id,
- Activity::Type type,
- const ActivityData& data);
-
- void PopActivity(ActivityId id);
-
- bool IsRecorded(ActivityId id);
-
- std::unique_ptr<ActivityUserData> GetUserData(
- ActivityId id,
- ActivityTrackerMemoryAllocator* allocator);
-
-
- bool HasUserData(ActivityId id);
-
- void ReleaseUserData(ActivityId id,
- ActivityTrackerMemoryAllocator* allocator);
-
- void RecordExceptionActivity(const void* program_counter,
- const void* origin,
- Activity::Type type,
- const ActivityData& data);
-
-
- bool IsValid() const;
-
-
-
-
- bool CreateSnapshot(Snapshot* output_snapshot) const;
-
- const void* GetBaseAddress();
-
-
- uint32_t GetDataVersionForTesting();
-
- void SetOwningProcessIdForTesting(int64_t pid, int64_t stamp);
-
-
-
- static bool GetOwningProcessId(const void* memory,
- int64_t* out_id,
- int64_t* out_stamp);
-
-
- static size_t SizeForStackDepth(int stack_depth);
- private:
- friend class ActivityTrackerTest;
- bool CalledOnValidThread();
- std::unique_ptr<ActivityUserData> CreateUserDataForActivity(
- Activity* activity,
- ActivityTrackerMemoryAllocator* allocator);
- Header* const header_;
- Activity* const stack_;
- #if DCHECK_IS_ON()
-
-
-
- const PlatformThreadRef thread_id_;
- #endif
- const uint32_t stack_slots_;
- bool valid_ = false;
- DISALLOW_COPY_AND_ASSIGN(ThreadActivityTracker);
- };
- class BASE_EXPORT GlobalActivityTracker {
- public:
-
-
-
-
-
-
- enum : uint32_t {
- kTypeIdActivityTracker = 0x5D7381AF + 4,
- kTypeIdUserDataRecord = 0x615EDDD7 + 3,
- kTypeIdGlobalLogMessage = 0x4CF434F9 + 1,
- kTypeIdProcessDataRecord = kTypeIdUserDataRecord + 0x100,
- kTypeIdActivityTrackerFree = ~kTypeIdActivityTracker,
- kTypeIdUserDataRecordFree = ~kTypeIdUserDataRecord,
- kTypeIdProcessDataRecordFree = ~kTypeIdProcessDataRecord,
- };
-
-
-
- enum ProcessPhase : int {
-
- PROCESS_PHASE_UNKNOWN = 0,
- PROCESS_LAUNCHED = 1,
- PROCESS_LAUNCH_FAILED = 2,
- PROCESS_EXITED_CLEANLY = 10,
- PROCESS_EXITED_WITH_CODE = 11,
-
- PROCESS_SHUTDOWN_STARTED = 100,
- PROCESS_MAIN_LOOP_STARTED = 101,
- };
-
-
-
-
- using ProcessExitCallback =
- RepeatingCallback<void(int64_t process_id,
- int64_t exit_stamp,
- int exit_code,
- ProcessPhase exit_phase,
- std::string&& command_line,
- ActivityUserData::Snapshot&& process_data)>;
-
-
- struct BASE_EXPORT ModuleInfo {
- ModuleInfo();
- ModuleInfo(ModuleInfo&& rhs);
- ModuleInfo(const ModuleInfo& rhs);
- ~ModuleInfo();
- ModuleInfo& operator=(ModuleInfo&& rhs);
- ModuleInfo& operator=(const ModuleInfo& rhs);
-
- bool is_loaded = false;
- uintptr_t address = 0;
- int64_t load_time = 0;
-
-
- size_t size = 0;
- uint32_t timestamp = 0;
- uint32_t age = 0;
- uint8_t identifier[16];
- std::string file;
- std::string debug_file;
- };
-
-
-
- class BASE_EXPORT ScopedThreadActivity
- : public ThreadActivityTracker::ScopedActivity {
- public:
- ScopedThreadActivity(const void* program_counter,
- const void* origin,
- Activity::Type type,
- const ActivityData& data,
- bool lock_allowed);
- ~ScopedThreadActivity();
-
- ActivityUserData& user_data();
- private:
-
-
-
-
-
- static ThreadActivityTracker* GetOrCreateTracker(bool lock_allowed) {
- GlobalActivityTracker* global_tracker = Get();
- if (!global_tracker)
- return nullptr;
- if (lock_allowed)
- return global_tracker->GetOrCreateTrackerForCurrentThread();
- else
- return global_tracker->GetTrackerForCurrentThread();
- }
-
- std::unique_ptr<ActivityUserData> user_data_;
- DISALLOW_COPY_AND_ASSIGN(ScopedThreadActivity);
- };
- ~GlobalActivityTracker();
-
-
-
-
-
- static void CreateWithAllocator(
- std::unique_ptr<PersistentMemoryAllocator> allocator,
- int stack_depth,
- int64_t process_id);
- #if !defined(OS_NACL)
-
-
-
-
- static bool CreateWithFile(const FilePath& file_path,
- size_t size,
- uint64_t id,
- StringPiece name,
- int stack_depth);
- #endif
-
-
-
- static bool CreateWithLocalMemory(size_t size,
- uint64_t id,
- StringPiece name,
- int stack_depth,
- int64_t process_id);
-
-
- static bool CreateWithSharedMemory(base::WritableSharedMemoryMapping mapping,
- uint64_t id,
- StringPiece name,
- int stack_depth);
-
- static GlobalActivityTracker* Get() {
- return reinterpret_cast<GlobalActivityTracker*>(
- subtle::Acquire_Load(&g_tracker_));
- }
-
- static void SetForTesting(std::unique_ptr<GlobalActivityTracker> tracker);
-
-
-
-
- static std::unique_ptr<GlobalActivityTracker> ReleaseForTesting();
-
- static bool IsEnabled() { return Get() != nullptr; }
-
-
-
- PersistentMemoryAllocator* allocator() { return allocator_.get(); }
-
-
-
-
- ThreadActivityTracker* GetTrackerForCurrentThread() {
-
- if (base::ThreadLocalStorage::HasBeenDestroyed())
- return nullptr;
- return this_thread_tracker_.Get();
- }
-
-
-
- ThreadActivityTracker* GetOrCreateTrackerForCurrentThread() {
- ThreadActivityTracker* tracker = GetTrackerForCurrentThread();
- if (tracker)
- return tracker;
- return CreateTrackerForCurrentThread();
- }
-
- ThreadActivityTracker* CreateTrackerForCurrentThread();
-
- void ReleaseTrackerForCurrentThreadForTesting();
-
- void SetBackgroundTaskRunner(
- const scoped_refptr<SequencedTaskRunner>& runner);
-
- void SetProcessExitCallback(ProcessExitCallback callback);
-
-
-
-
- void RecordProcessLaunch(ProcessId process_id,
- const FilePath::StringType& cmd);
- void RecordProcessLaunch(ProcessId process_id,
- const FilePath::StringType& exe,
- const FilePath::StringType& args);
- void RecordProcessExit(ProcessId process_id, int exit_code);
- static void RecordProcessLaunchIfEnabled(ProcessId process_id,
- const FilePath::StringType& cmd) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->RecordProcessLaunch(process_id, cmd);
- }
- static void RecordProcessLaunchIfEnabled(ProcessId process_id,
- const FilePath::StringType& exe,
- const FilePath::StringType& args) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->RecordProcessLaunch(process_id, exe, args);
- }
- static void RecordProcessExitIfEnabled(ProcessId process_id, int exit_code) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->RecordProcessExit(process_id, exit_code);
- }
-
-
- void SetProcessPhase(ProcessPhase phase);
- static void SetProcessPhaseIfEnabled(ProcessPhase phase) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->SetProcessPhase(phase);
- }
-
-
- void RecordLogMessage(StringPiece message);
- static void RecordLogMessageIfEnabled(StringPiece message) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->RecordLogMessage(message);
- }
-
-
- void RecordModuleInfo(const ModuleInfo& info);
- static void RecordModuleInfoIfEnabled(const ModuleInfo& info) {
- GlobalActivityTracker* tracker = Get();
- if (tracker)
- tracker->RecordModuleInfo(info);
- }
-
- ALWAYS_INLINE
- void RecordException(const void* origin, uint32_t code) {
- return RecordExceptionImpl(GetProgramCounter(), origin, code);
- }
- void RecordException(const void* pc, const void* origin, uint32_t code);
-
- void MarkDeleted();
-
-
- int64_t process_id() { return process_id_; }
-
-
- ActivityUserData& process_data() { return process_data_; }
- private:
- friend class GlobalActivityAnalyzer;
- friend class ScopedThreadActivity;
- friend class ActivityTrackerTest;
- enum : int {
-
-
- kMaxThreadCount = 100,
- kCachedThreadMemories = 10,
- kCachedUserDataMemories = 10,
- };
-
-
-
- class ThreadSafeUserData : public ActivityUserData {
- public:
- ThreadSafeUserData(void* memory, size_t size, int64_t pid = 0);
- ~ThreadSafeUserData() override;
- private:
- void* Set(StringPiece name,
- ValueType type,
- const void* memory,
- size_t size) override;
- Lock data_lock_;
- DISALLOW_COPY_AND_ASSIGN(ThreadSafeUserData);
- };
-
-
-
-
- struct BASE_EXPORT ModuleInfoRecord {
-
- static constexpr uint32_t kPersistentTypeId = 0x05DB5F41 + 1;
-
- static constexpr size_t kExpectedInstanceSize =
- OwningProcess::kExpectedInstanceSize + 56;
-
-
-
- ModuleInfoRecord();
- ~ModuleInfoRecord();
- OwningProcess owner;
- uint64_t address;
- uint64_t load_time;
- uint64_t size;
- uint32_t timestamp;
- uint32_t age;
- uint8_t identifier[16];
- std::atomic<uint32_t> changes;
- uint16_t pickle_size;
- uint8_t loaded;
- char pickle[1];
-
- bool DecodeTo(GlobalActivityTracker::ModuleInfo* info,
- size_t record_size) const;
- static ModuleInfoRecord* CreateFrom(
- const GlobalActivityTracker::ModuleInfo& info,
- PersistentMemoryAllocator* allocator);
-
-
- bool UpdateFrom(const GlobalActivityTracker::ModuleInfo& info);
- private:
- DISALLOW_COPY_AND_ASSIGN(ModuleInfoRecord);
- };
-
-
- class ManagedActivityTracker : public ThreadActivityTracker {
- public:
- ManagedActivityTracker(PersistentMemoryAllocator::Reference mem_reference,
- void* base,
- size_t size);
- ~ManagedActivityTracker() override;
-
-
- const PersistentMemoryAllocator::Reference mem_reference_;
-
- void* const mem_base_;
- private:
- DISALLOW_COPY_AND_ASSIGN(ManagedActivityTracker);
- };
-
-
-
-
-
- GlobalActivityTracker(std::unique_ptr<PersistentMemoryAllocator> allocator,
- int stack_depth,
- int64_t process_id);
-
-
- void ReturnTrackerMemory(ManagedActivityTracker* tracker);
-
- void RecordExceptionImpl(const void* pc, const void* origin, uint32_t code);
-
-
-
- static void OnTLSDestroy(void* value);
-
- void CleanupAfterProcess(int64_t process_id,
- int64_t exit_stamp,
- int exit_code,
- std::string&& command_line);
-
-
- std::unique_ptr<PersistentMemoryAllocator> allocator_;
-
-
- const size_t stack_memory_size_;
-
-
- const int64_t process_id_;
-
- ThreadLocalOwnedPointer<ThreadActivityTracker> this_thread_tracker_;
-
- std::atomic<int> thread_tracker_count_;
-
- ActivityTrackerMemoryAllocator thread_tracker_allocator_;
- Lock thread_tracker_allocator_lock_;
-
- ActivityTrackerMemoryAllocator user_data_allocator_;
- Lock user_data_allocator_lock_;
-
- ThreadSafeUserData process_data_;
-
- std::map<const std::string, ModuleInfoRecord*> modules_;
- Lock modules_lock_;
-
- static subtle::AtomicWord g_tracker_;
-
- Lock global_tracker_lock_;
-
- std::map<int64_t, std::string> known_processes_;
-
- scoped_refptr<SequencedTaskRunner> background_task_runner_;
-
-
-
-
- ProcessExitCallback process_exit_callback_;
- DISALLOW_COPY_AND_ASSIGN(GlobalActivityTracker);
- };
- class BASE_EXPORT ScopedActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ALWAYS_INLINE
- ScopedActivity(uint8_t action, uint32_t id, int32_t info)
- : ScopedActivity(GetProgramCounter(), action, id, info) {}
- ScopedActivity(Location from_here, uint8_t action, uint32_t id, int32_t info)
- : ScopedActivity(from_here.program_counter(), action, id, info) {}
- ScopedActivity() : ScopedActivity(0, 0, 0) {}
-
-
-
-
-
- void ChangeAction(uint8_t action);
- void ChangeInfo(int32_t info);
- void ChangeActionAndInfo(uint8_t action, int32_t info);
- private:
-
- ScopedActivity(const void* program_counter,
- uint8_t action,
- uint32_t id,
- int32_t info);
-
-
- uint32_t id_;
- DISALLOW_COPY_AND_ASSIGN(ScopedActivity);
- };
- class BASE_EXPORT ScopedTaskRunActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
- ALWAYS_INLINE
- explicit ScopedTaskRunActivity(const PendingTask& task)
- : ScopedTaskRunActivity(GetProgramCounter(), task) {}
- private:
- ScopedTaskRunActivity(const void* program_counter, const PendingTask& task);
- DISALLOW_COPY_AND_ASSIGN(ScopedTaskRunActivity);
- };
- class BASE_EXPORT ScopedLockAcquireActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
- ALWAYS_INLINE
- explicit ScopedLockAcquireActivity(const base::internal::LockImpl* lock)
- : ScopedLockAcquireActivity(GetProgramCounter(), lock) {}
- private:
- ScopedLockAcquireActivity(const void* program_counter,
- const base::internal::LockImpl* lock);
- DISALLOW_COPY_AND_ASSIGN(ScopedLockAcquireActivity);
- };
- class BASE_EXPORT ScopedEventWaitActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
- ALWAYS_INLINE
- explicit ScopedEventWaitActivity(const WaitableEvent* event)
- : ScopedEventWaitActivity(GetProgramCounter(), event) {}
- private:
- ScopedEventWaitActivity(const void* program_counter,
- const WaitableEvent* event);
- DISALLOW_COPY_AND_ASSIGN(ScopedEventWaitActivity);
- };
- class BASE_EXPORT ScopedThreadJoinActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
- ALWAYS_INLINE
- explicit ScopedThreadJoinActivity(const PlatformThreadHandle* thread)
- : ScopedThreadJoinActivity(GetProgramCounter(), thread) {}
- private:
- ScopedThreadJoinActivity(const void* program_counter,
- const PlatformThreadHandle* thread);
- DISALLOW_COPY_AND_ASSIGN(ScopedThreadJoinActivity);
- };
- #if !defined(OS_NACL) && !defined(OS_IOS)
- class BASE_EXPORT ScopedProcessWaitActivity
- : public GlobalActivityTracker::ScopedThreadActivity {
- public:
- ALWAYS_INLINE
- explicit ScopedProcessWaitActivity(const Process* process)
- : ScopedProcessWaitActivity(GetProgramCounter(), process) {}
- private:
- ScopedProcessWaitActivity(const void* program_counter,
- const Process* process);
- DISALLOW_COPY_AND_ASSIGN(ScopedProcessWaitActivity);
- };
- #endif
- }
- }
- #endif
|