1 // Copyright (c) 2012 The Chromium 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 #include "base/debug/trace_event_win.h"
6 #include "base/logging.h"
7 #include "base/memory/singleton.h"
8 #include <initguid.h> // NOLINT
13 using base::win::EtwEventType
;
14 using base::win::EtwMofEvent
;
16 // {3DADA31D-19EF-4dc1-B345-037927193422}
17 const GUID kChromeTraceProviderName
= {
18 0x3dada31d, 0x19ef, 0x4dc1, 0xb3, 0x45, 0x3, 0x79, 0x27, 0x19, 0x34, 0x22 };
20 // {B967AE67-BB22-49d7-9406-55D91EE1D560}
21 const GUID kTraceEventClass32
= {
22 0xb967ae67, 0xbb22, 0x49d7, 0x94, 0x6, 0x55, 0xd9, 0x1e, 0xe1, 0xd5, 0x60 };
24 // {97BE602D-2930-4ac3-8046-B6763B631DFE}
25 const GUID kTraceEventClass64
= {
26 0x97be602d, 0x2930, 0x4ac3, 0x80, 0x46, 0xb6, 0x76, 0x3b, 0x63, 0x1d, 0xfe};
29 TraceEventETWProvider::TraceEventETWProvider() :
30 EtwTraceProvider(kChromeTraceProviderName
) {
34 TraceEventETWProvider
* TraceEventETWProvider::GetInstance() {
35 return Singleton
<TraceEventETWProvider
,
36 StaticMemorySingletonTraits
<TraceEventETWProvider
> >::get();
39 bool TraceEventETWProvider::StartTracing() {
43 void TraceEventETWProvider::TraceEvent(const char* name
,
49 // Make sure we don't touch NULL.
55 EtwEventType etw_type
= 0;
57 case TRACE_EVENT_PHASE_BEGIN
:
58 etw_type
= kTraceEventTypeBegin
;
60 case TRACE_EVENT_PHASE_END
:
61 etw_type
= kTraceEventTypeEnd
;
64 case TRACE_EVENT_PHASE_INSTANT
:
65 etw_type
= kTraceEventTypeInstant
;
69 NOTREACHED() << "Unknown event type";
70 etw_type
= kTraceEventTypeInstant
;
74 EtwMofEvent
<5> event(kTraceEventClass32
,
76 TRACE_LEVEL_INFORMATION
);
77 event
.SetField(0, name_len
+ 1, name
);
78 event
.SetField(1, sizeof(id
), &id
);
79 event
.SetField(2, extra_len
+ 1, extra
);
81 // See whether we're to capture a backtrace.
83 if (enable_flags() & CAPTURE_STACK_TRACE
) {
85 DWORD depth
= CaptureStackBackTrace(0,
89 event
.SetField(3, sizeof(depth
), &depth
);
90 event
.SetField(4, sizeof(backtrace
[0]) * depth
, backtrace
);
97 void TraceEventETWProvider::Trace(const char* name
,
103 TraceEventETWProvider
* provider
= TraceEventETWProvider::GetInstance();
104 if (provider
&& provider
->IsTracing()) {
105 // Compute the name & extra lengths if not supplied already.
107 name_len
= (name
== NULL
) ? 0 : strlen(name
);
109 extra_len
= (extra
== NULL
) ? 0 : strlen(extra
);
111 provider
->TraceEvent(name
, name_len
, type
, id
, extra
, extra_len
);
115 void TraceEventETWProvider::Resurrect() {
116 StaticMemorySingletonTraits
<TraceEventETWProvider
>::Resurrect();