Loading...
Searching...
No Matches
v8-tracing.h
Go to the documentation of this file.
1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_LIBPLATFORM_V8_TRACING_H_
6#define V8_LIBPLATFORM_V8_TRACING_H_
7
8#include <atomic>
9#include <memory>
10#include <unordered_set>
11#include <vector>
12
14#include "v8-platform.h" // NOLINT(build/include_directory)
15
16namespace perfetto {
17#if defined(V8_USE_PERFETTO_JSON_EXPORT)
18namespace trace_processor {
19class TraceProcessorStorage;
20}
21#endif // defined(V8_USE_PERFETTO_JSON_EXPORT)
22class TracingSession;
23}
24
25namespace v8 {
26
27namespace base {
28class Mutex;
29} // namespace base
30
31namespace platform {
32namespace tracing {
33
34class TraceEventListener;
35
36const int kTraceMaxNumArgs = 2;
37
38#if !defined(V8_USE_PERFETTO)
40 public:
41 union ArgValue {
42 uint64_t as_uint;
43 int64_t as_int;
44 double as_double;
45 const void* as_pointer;
46 const char* as_string;
47 };
48
49 TraceObject() = default;
52 char phase, const uint8_t* category_enabled_flag, const char* name,
53 const char* scope, uint64_t id, uint64_t bind_id, int num_args,
54 const char** arg_names, const uint8_t* arg_types,
55 const uint64_t* arg_values,
56 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
57 unsigned int flags, int64_t timestamp, int64_t cpu_timestamp);
58 void UpdateDuration(int64_t timestamp, int64_t cpu_timestamp);
60 char phase, const uint8_t* category_enabled_flag, const char* name,
61 const char* scope, uint64_t id, uint64_t bind_id, int num_args,
62 const char** arg_names, const uint8_t* arg_types,
63 const uint64_t* arg_values,
64 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
65 unsigned int flags, int pid, int tid, int64_t ts, int64_t tts,
66 uint64_t duration, uint64_t cpu_duration);
67
68 int pid() const { return pid_; }
69 int tid() const { return tid_; }
70 char phase() const { return phase_; }
71 const uint8_t* category_enabled_flag() const {
72 return category_enabled_flag_;
73 }
74 const char* name() const { return name_; }
75 const char* scope() const { return scope_; }
76 uint64_t id() const { return id_; }
77 uint64_t bind_id() const { return bind_id_; }
78 int num_args() const { return num_args_; }
79 const char** arg_names() { return arg_names_; }
80 uint8_t* arg_types() { return arg_types_; }
81 ArgValue* arg_values() { return arg_values_; }
82 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables() {
83 return arg_convertables_;
84 }
85 unsigned int flags() const { return flags_; }
86 int64_t ts() { return ts_; }
87 int64_t tts() { return tts_; }
88 uint64_t duration() { return duration_; }
89 uint64_t cpu_duration() { return cpu_duration_; }
90
91 private:
92 int pid_;
93 int tid_;
94 char phase_;
95 const char* name_;
96 const char* scope_;
97 const uint8_t* category_enabled_flag_;
98 uint64_t id_;
99 uint64_t bind_id_;
100 int num_args_ = 0;
101 const char* arg_names_[kTraceMaxNumArgs];
102 uint8_t arg_types_[kTraceMaxNumArgs];
103 ArgValue arg_values_[kTraceMaxNumArgs];
104 std::unique_ptr<v8::ConvertableToTraceFormat>
105 arg_convertables_[kTraceMaxNumArgs];
106 char* parameter_copy_storage_ = nullptr;
107 unsigned int flags_;
108 int64_t ts_;
109 int64_t tts_;
110 uint64_t duration_;
111 uint64_t cpu_duration_;
112
113 // Disallow copy and assign
114 TraceObject(const TraceObject&) = delete;
115 void operator=(const TraceObject&) = delete;
116};
117
119 public:
120 TraceWriter() = default;
121 virtual ~TraceWriter() = default;
122 virtual void AppendTraceEvent(TraceObject* trace_event) = 0;
123 virtual void Flush() = 0;
124
125 static TraceWriter* CreateJSONTraceWriter(std::ostream& stream);
126 static TraceWriter* CreateJSONTraceWriter(std::ostream& stream,
127 const std::string& tag);
128
130
131 private:
132 // Disallow copy and assign
133 TraceWriter(const TraceWriter&) = delete;
134 void operator=(const TraceWriter&) = delete;
135};
136
138 public:
139 explicit TraceBufferChunk(uint32_t seq);
140
141 void Reset(uint32_t new_seq);
142 bool IsFull() const { return next_free_ == kChunkSize; }
143 TraceObject* AddTraceEvent(size_t* event_index);
144 TraceObject* GetEventAt(size_t index) { return &chunk_[index]; }
145
146 uint32_t seq() const { return seq_; }
147 size_t size() const { return next_free_; }
148
149 static const size_t kChunkSize = 64;
150
151 private:
152 size_t next_free_ = 0;
153 TraceObject chunk_[kChunkSize];
154 uint32_t seq_;
155
156 // Disallow copy and assign
157 TraceBufferChunk(const TraceBufferChunk&) = delete;
158 void operator=(const TraceBufferChunk&) = delete;
159};
160
162 public:
163 TraceBuffer() = default;
164 virtual ~TraceBuffer() = default;
165
166 virtual TraceObject* AddTraceEvent(uint64_t* handle) = 0;
167 virtual TraceObject* GetEventByHandle(uint64_t handle) = 0;
168 virtual bool Flush() = 0;
169
170 static const size_t kRingBufferChunks = 1024;
171
172 static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks,
173 TraceWriter* trace_writer);
174
175 private:
176 // Disallow copy and assign
177 TraceBuffer(const TraceBuffer&) = delete;
178 void operator=(const TraceBuffer&) = delete;
179};
180#endif // !defined(V8_USE_PERFETTO)
181
182// Options determines how the trace buffer stores data.
184 // Record until the trace buffer is full.
186
187 // Record until the user ends the trace. The trace buffer is a fixed size
188 // and we use it as a ring buffer during recording.
190
191 // Record until the trace buffer is full, but with a huge buffer size.
193
194 // Echo to console. Events are discarded.
196};
197
199 public:
200 typedef std::vector<std::string> StringList;
201
203
204 TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {}
205 TraceRecordMode GetTraceRecordMode() const { return record_mode_; }
207 return included_categories_;
208 }
209 bool IsSystraceEnabled() const { return enable_systrace_; }
210 bool IsArgumentFilterEnabled() const { return enable_argument_filter_; }
211
212 void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; }
213 void EnableSystrace() { enable_systrace_ = true; }
214 void EnableArgumentFilter() { enable_argument_filter_ = true; }
215
216 void AddIncludedCategory(const char* included_category);
217
218 bool IsCategoryGroupEnabled(const char* category_group) const;
219
220 private:
221 TraceRecordMode record_mode_;
222 bool enable_systrace_ : 1;
223 bool enable_argument_filter_ : 1;
224 StringList included_categories_;
225
226 // Disallow copy and assign
227 TraceConfig(const TraceConfig&) = delete;
228 void operator=(const TraceConfig&) = delete;
229};
230
231#if defined(_MSC_VER)
232#define V8_PLATFORM_NON_EXPORTED_BASE(code) \
233 __pragma(warning(suppress : 4275)) code
234#else
235#define V8_PLATFORM_NON_EXPORTED_BASE(code) code
236#endif // defined(_MSC_VER)
237
245 : public V8_PLATFORM_NON_EXPORTED_BASE(v8::TracingController) {
246 public:
249
250#if defined(V8_USE_PERFETTO)
251 // Must be called before StartTracing() if V8_USE_PERFETTO is true. Provides
252 // the output stream for the JSON trace data.
253 void InitializeForPerfetto(std::ostream* output_stream);
254 // Provide an optional listener for testing that will receive trace events.
255 // Must be called before StartTracing().
256 void SetTraceEventListenerForTesting(TraceEventListener* listener);
257#else // defined(V8_USE_PERFETTO)
258 // The pointer returned from GetCategoryGroupEnabled() points to a value with
259 // zero or more of the following bits. Used in this class only. The
260 // TRACE_EVENT macros should only use the value as a bool. These values must
261 // be in sync with macro values in TraceEvent.h in Blink.
263 // Category group enabled for the recording mode.
264 ENABLED_FOR_RECORDING = 1 << 0,
265 // Category group enabled by SetEventCallbackEnabled().
266 ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
267 // Category group enabled to export events to ETW.
268 ENABLED_FOR_ETW_EXPORT = 1 << 3
269 };
270
271 // Takes ownership of |trace_buffer|.
272 void Initialize(TraceBuffer* trace_buffer);
273
274 // v8::TracingController implementation.
275 const uint8_t* GetCategoryGroupEnabled(const char* category_group) override;
277 char phase, const uint8_t* category_enabled_flag, const char* name,
278 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
279 const char** arg_names, const uint8_t* arg_types,
280 const uint64_t* arg_values,
281 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
282 unsigned int flags) override;
284 char phase, const uint8_t* category_enabled_flag, const char* name,
285 const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
286 const char** arg_names, const uint8_t* arg_types,
287 const uint64_t* arg_values,
288 std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
289 unsigned int flags, int64_t timestamp) override;
290 void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
291 const char* name, uint64_t handle) override;
292
293 static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
294
299#endif // !defined(V8_USE_PERFETTO)
300
301 void StartTracing(TraceConfig* trace_config);
303
304 protected:
305#if !defined(V8_USE_PERFETTO)
308#endif // !defined(V8_USE_PERFETTO)
309
310 private:
311#if !defined(V8_USE_PERFETTO)
312 void UpdateCategoryGroupEnabledFlag(size_t category_index);
313 void UpdateCategoryGroupEnabledFlags();
314#endif // !defined(V8_USE_PERFETTO)
315
316 std::unique_ptr<base::Mutex> mutex_;
317 std::unique_ptr<TraceConfig> trace_config_;
318 std::atomic_bool recording_{false};
319
320#if defined(V8_USE_PERFETTO_JSON_EXPORT)
321 std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
322 trace_processor_;
323#endif
324
325#if defined(V8_USE_PERFETTO)
326 std::ostream* output_stream_ = nullptr;
327 TraceEventListener* listener_for_testing_ = nullptr;
328 std::unique_ptr<perfetto::TracingSession> tracing_session_;
329#else // !defined(V8_USE_PERFETTO)
330 std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
331 std::unique_ptr<TraceBuffer> trace_buffer_;
332#endif // !defined(V8_USE_PERFETTO)
333
334 // Disallow copy and assign
335 TracingController(const TracingController&) = delete;
336 void operator=(const TracingController&) = delete;
337};
338
339#undef V8_PLATFORM_NON_EXPORTED_BASE
340
341} // namespace tracing
342} // namespace platform
343} // namespace v8
344
345#endif // V8_LIBPLATFORM_V8_TRACING_H_
Definition: v8-platform.h:461
Definition: v8-tracing.h:137
size_t size() const
Definition: v8-tracing.h:147
TraceObject * GetEventAt(size_t index)
Definition: v8-tracing.h:144
uint32_t seq() const
Definition: v8-tracing.h:146
TraceObject * AddTraceEvent(size_t *event_index)
bool IsFull() const
Definition: v8-tracing.h:142
Definition: v8-tracing.h:161
virtual TraceObject * AddTraceEvent(uint64_t *handle)=0
virtual TraceObject * GetEventByHandle(uint64_t handle)=0
static TraceBuffer * CreateTraceBufferRingBuffer(size_t max_chunks, TraceWriter *trace_writer)
Definition: v8-tracing.h:198
std::vector< std::string > StringList
Definition: v8-tracing.h:200
TraceRecordMode GetTraceRecordMode() const
Definition: v8-tracing.h:205
bool IsSystraceEnabled() const
Definition: v8-tracing.h:209
bool IsArgumentFilterEnabled() const
Definition: v8-tracing.h:210
void EnableArgumentFilter()
Definition: v8-tracing.h:214
void AddIncludedCategory(const char *included_category)
bool IsCategoryGroupEnabled(const char *category_group) const
TraceConfig()
Definition: v8-tracing.h:204
const StringList & GetEnabledCategories() const
Definition: v8-tracing.h:206
static TraceConfig * CreateDefaultTraceConfig()
void SetTraceRecordMode(TraceRecordMode mode)
Definition: v8-tracing.h:212
void EnableSystrace()
Definition: v8-tracing.h:213
Definition: v8-tracing.h:39
ArgValue * arg_values()
Definition: v8-tracing.h:81
const char * scope() const
Definition: v8-tracing.h:75
std::unique_ptr< v8::ConvertableToTraceFormat > * arg_convertables()
Definition: v8-tracing.h:82
const uint8_t * category_enabled_flag() const
Definition: v8-tracing.h:71
const char ** arg_names()
Definition: v8-tracing.h:79
char phase() const
Definition: v8-tracing.h:70
const char * name() const
Definition: v8-tracing.h:74
uint64_t cpu_duration()
Definition: v8-tracing.h:89
uint64_t duration()
Definition: v8-tracing.h:88
int num_args() const
Definition: v8-tracing.h:78
void Initialize(char phase, const uint8_t *category_enabled_flag, const char *name, const char *scope, uint64_t id, uint64_t bind_id, int num_args, const char **arg_names, const uint8_t *arg_types, const uint64_t *arg_values, std::unique_ptr< v8::ConvertableToTraceFormat > *arg_convertables, unsigned int flags, int64_t timestamp, int64_t cpu_timestamp)
uint8_t * arg_types()
Definition: v8-tracing.h:80
int64_t ts()
Definition: v8-tracing.h:86
unsigned int flags() const
Definition: v8-tracing.h:85
uint64_t bind_id() const
Definition: v8-tracing.h:77
int tid() const
Definition: v8-tracing.h:69
void InitializeForTesting(char phase, const uint8_t *category_enabled_flag, const char *name, const char *scope, uint64_t id, uint64_t bind_id, int num_args, const char **arg_names, const uint8_t *arg_types, const uint64_t *arg_values, std::unique_ptr< v8::ConvertableToTraceFormat > *arg_convertables, unsigned int flags, int pid, int tid, int64_t ts, int64_t tts, uint64_t duration, uint64_t cpu_duration)
void UpdateDuration(int64_t timestamp, int64_t cpu_timestamp)
int64_t tts()
Definition: v8-tracing.h:87
uint64_t id() const
Definition: v8-tracing.h:76
int pid() const
Definition: v8-tracing.h:68
Definition: v8-tracing.h:118
virtual void AppendTraceEvent(TraceObject *trace_event)=0
static TraceWriter * CreateJSONTraceWriter(std::ostream &stream, const std::string &tag)
static TraceWriter * CreateJSONTraceWriter(std::ostream &stream)
static TraceWriter * CreateSystemInstrumentationTraceWriter()
Definition: v8-tracing.h:245
void StartTracing(TraceConfig *trace_config)
void Initialize(TraceBuffer *trace_buffer)
uint64_t AddTraceEvent(char phase, const uint8_t *category_enabled_flag, const char *name, const char *scope, uint64_t id, uint64_t bind_id, int32_t num_args, const char **arg_names, const uint8_t *arg_types, const uint64_t *arg_values, std::unique_ptr< v8::ConvertableToTraceFormat > *arg_convertables, unsigned int flags) override
const uint8_t * GetCategoryGroupEnabled(const char *category_group) override
CategoryGroupEnabledFlags
Definition: v8-tracing.h:262
virtual int64_t CurrentCpuTimestampMicroseconds()
static const char * GetCategoryGroupName(const uint8_t *category_enabled_flag)
void RemoveTraceStateObserver(v8::TracingController::TraceStateObserver *observer) override
void AddTraceStateObserver(v8::TracingController::TraceStateObserver *observer) override
void UpdateTraceEventDuration(const uint8_t *category_enabled_flag, const char *name, uint64_t handle) override
uint64_t AddTraceEventWithTimestamp(char phase, const uint8_t *category_enabled_flag, const char *name, const char *scope, uint64_t id, uint64_t bind_id, int32_t num_args, const char **arg_names, const uint8_t *arg_types, const uint64_t *arg_values, std::unique_ptr< v8::ConvertableToTraceFormat > *arg_convertables, unsigned int flags, int64_t timestamp) override
#define V8_PLATFORM_EXPORT
Definition: libplatform-export.h:24
Definition: v8-tracing.h:16
const int kTraceMaxNumArgs
Definition: v8-tracing.h:36
TraceRecordMode
Definition: v8-tracing.h:183
@ RECORD_UNTIL_FULL
Definition: v8-tracing.h:185
@ RECORD_CONTINUOUSLY
Definition: v8-tracing.h:189
@ RECORD_AS_MUCH_AS_POSSIBLE
Definition: v8-tracing.h:192
@ ECHO_TO_CONSOLE
Definition: v8-tracing.h:195
Definition: libplatform.h:15
const char * as_string
Definition: v8-tracing.h:46
int64_t as_int
Definition: v8-tracing.h:43
uint64_t as_uint
Definition: v8-tracing.h:42
double as_double
Definition: v8-tracing.h:44
const void * as_pointer
Definition: v8-tracing.h:45
#define V8_PLATFORM_NON_EXPORTED_BASE(code)
Definition: v8-tracing.h:235