xref: /aosp_15_r20/external/cronet/base/debug/task_trace.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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