1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_DEBUG_TASK_TRACE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_DEBUG_TASK_TRACE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <iosfwd> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/debug/stack_trace.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace base { 17*6777b538SAndroid Build Coastguard Worker namespace debug { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker // Provides a snapshot of which places in the code called 20*6777b538SAndroid Build Coastguard Worker // base::TaskRunner::PostTask() that led to the TaskTrace() constructor call. 21*6777b538SAndroid Build Coastguard Worker // Analogous to base::StackTrace, but for posted tasks rather than function 22*6777b538SAndroid Build Coastguard Worker // calls. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Example usage: 25*6777b538SAndroid Build Coastguard Worker // TaskTrace().Print(); 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // Example output: 28*6777b538SAndroid Build Coastguard Worker // Task trace: 29*6777b538SAndroid Build Coastguard Worker // #0 content::ServiceWorkerContextWrapper::DidCheckHasServiceWorker() 30*6777b538SAndroid Build Coastguard Worker // #1 content::ServiceWorkerStorage::FindForDocumentInDB() 31*6777b538SAndroid Build Coastguard Worker // #2 content::ServiceWorkerStorage::FindRegistrationForDocument() 32*6777b538SAndroid Build Coastguard Worker // #3 content::ServiceWorkerContextWrapper::CheckHasServiceWorker() 33*6777b538SAndroid Build Coastguard Worker // #4 content::ManifestIconDownloader::ScaleIcon() 34*6777b538SAndroid Build Coastguard Worker // Task trace buffer limit hit, update PendingTask::kTaskBacktraceLength to 35*6777b538SAndroid Build Coastguard Worker // increase. 36*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TaskTrace { 37*6777b538SAndroid Build Coastguard Worker public: 38*6777b538SAndroid Build Coastguard Worker TaskTrace(); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Whether there is any trace data. 41*6777b538SAndroid Build Coastguard Worker bool empty() const; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Outputs to stderr via OutputToStream. 44*6777b538SAndroid Build Coastguard Worker void Print() const; 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // Outputs trace to |os|, may be called when empty() is true. 47*6777b538SAndroid Build Coastguard Worker void OutputToStream(std::ostream* os) const; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Resolves trace to symbols and returns as string. 50*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Reads the list of addresses currently in the task trace into `addresses`, 53*6777b538SAndroid Build Coastguard Worker // and returns the maximum length of addresses that could have been read, 54*6777b538SAndroid Build Coastguard Worker // which may differ from `addresses.size()`. 55*6777b538SAndroid Build Coastguard Worker size_t GetAddresses(span<const void*> addresses) const; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker private: 58*6777b538SAndroid Build Coastguard Worker std::optional<StackTrace> stack_trace_; 59*6777b538SAndroid Build Coastguard Worker bool trace_overflow_ = false; 60*6777b538SAndroid Build Coastguard Worker }; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Forwards to TaskTrace::OutputToStream. 63*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::ostream& operator<<(std::ostream& os, 64*6777b538SAndroid Build Coastguard Worker const TaskTrace& task_trace); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker } // namespace debug 67*6777b538SAndroid Build Coastguard Worker } // namespace base 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker #endif // BASE_DEBUG_TASK_TRACE_H_ 70