• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
5 // This file contains the Windows-specific declarations for trace_event.h.
6 #ifndef BASE_DEBUG_TRACE_EVENT_WIN_H_
7 #define BASE_DEBUG_TRACE_EVENT_WIN_H_
8 
9 #include <string>
10 
11 #include "base/base_export.h"
12 #include "base/debug/trace_event.h"
13 #include "base/win/event_trace_provider.h"
14 
15 // Fwd.
16 template <typename Type>
17 struct StaticMemorySingletonTraits;
18 
19 namespace base {
20 namespace debug {
21 
22 // This EtwTraceProvider subclass implements ETW logging
23 // for the macros above on Windows.
24 class BASE_EXPORT TraceEventETWProvider : public base::win::EtwTraceProvider {
25  public:
26   // Start logging trace events.
27   // This is a noop in this implementation.
28   static bool StartTracing();
29 
30   // Trace begin/end/instant events, this is the bottleneck implementation
31   // all the others defer to.
32   // Allowing the use of std::string for name or extra is a convenience,
33   // whereas passing name or extra as a const char* avoids the construction
34   // of temporary std::string instances.
35   // If -1 is passed for name_len or extra_len, the strlen of the string will
36   // be used for length.
37   static void Trace(const char* name,
38                     size_t name_len,
39                     char type,
40                     const void* id,
41                     const char* extra,
42                     size_t extra_len);
43 
44   // Allows passing extra as a std::string for convenience.
Trace(const char * name,char type,const void * id,const std::string & extra)45   static void Trace(const char* name,
46                     char type,
47                     const void* id,
48                     const std::string& extra) {
49     return Trace(name, -1, type, id, extra.c_str(), extra.length());
50   }
51 
52   // Allows passing extra as a const char* to avoid constructing temporary
53   // std::string instances where not needed.
Trace(const char * name,char type,const void * id,const char * extra)54   static void Trace(const char* name,
55                     char type,
56                     const void* id,
57                     const char* extra) {
58     return Trace(name, -1, type, id, extra, -1);
59   }
60 
61   // Retrieves the singleton.
62   // Note that this may return NULL post-AtExit processing.
63   static TraceEventETWProvider* GetInstance();
64 
65   // Returns true iff tracing is turned on.
IsTracing()66   bool IsTracing() {
67     return enable_level() >= TRACE_LEVEL_INFORMATION;
68   }
69 
70   // Emit a trace of type |type| containing |name|, |id|, and |extra|.
71   // Note: |name| and |extra| must be NULL, or a zero-terminated string of
72   //    length |name_len| or |extra_len| respectively.
73   // Note: if name_len or extra_len are -1, the length of the corresponding
74   //    string will be used.
75   void TraceEvent(const char* name,
76                   size_t name_len,
77                   char type,
78                   const void* id,
79                   const char* extra,
80                   size_t extra_len);
81 
82   // Exposed for unittesting only, allows resurrecting our
83   // singleton instance post-AtExit processing.
84   static void Resurrect();
85 
86  private:
87   // Ensure only the provider can construct us.
88   friend struct StaticMemorySingletonTraits<TraceEventETWProvider>;
89   TraceEventETWProvider();
90 
91   DISALLOW_COPY_AND_ASSIGN(TraceEventETWProvider);
92 };
93 
94 // The ETW trace provider GUID.
95 BASE_EXPORT extern const GUID kChromeTraceProviderName;
96 
97 // The ETW event class GUID for 32 bit events.
98 BASE_EXPORT extern const GUID kTraceEventClass32;
99 
100 // The ETW event class GUID for 64 bit events.
101 BASE_EXPORT extern const GUID kTraceEventClass64;
102 
103 // The ETW event types, IDs 0x00-0x09 are reserved, so start at 0x10.
104 const base::win::EtwEventType kTraceEventTypeBegin = 0x10;
105 const base::win::EtwEventType kTraceEventTypeEnd = 0x11;
106 const base::win::EtwEventType kTraceEventTypeInstant = 0x12;
107 
108 // If this flag is set in enable flags
109 enum TraceEventETWFlags {
110   CAPTURE_STACK_TRACE = 0x0001,
111 };
112 
113 // The event format consists of:
114 // The "name" string as a zero-terminated ASCII string.
115 // The id pointer in the machine bitness.
116 // The "extra" string as a zero-terminated ASCII string.
117 // Optionally the stack trace, consisting of a DWORD "depth", followed
118 //    by an array of void* (machine bitness) of length "depth".
119 
120 }  // namespace debug
121 }  // namespace base
122 
123 #endif  // BASE_DEBUG_TRACE_EVENT_WIN_H_
124