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