event_trace_controller.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Copyright (c) 2011 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. // Declaration of a Windows event trace controller class.
  6. // The controller takes care of creating and manipulating event trace
  7. // sessions.
  8. //
  9. // Event tracing for Windows is a system-provided service that provides
  10. // logging control and high-performance transport for generic, binary trace
  11. // events. Event trace providers register with the system by their name,
  12. // which is a GUID, and can from that point forward receive callbacks that
  13. // start or end tracing and that change their trace level and enable mask.
  14. //
  15. // A trace controller can create an event tracing session, which either
  16. // sends events to a binary file, or to a realtime consumer, or both.
  17. //
  18. // A trace consumer consumes events from zero or one realtime session,
  19. // as well as potentially from multiple binary trace files.
  20. #ifndef BASE_WIN_EVENT_TRACE_CONTROLLER_H_
  21. #define BASE_WIN_EVENT_TRACE_CONTROLLER_H_
  22. #include <windows.h>
  23. #include <evntrace.h>
  24. #include <stddef.h>
  25. #include <wmistr.h>
  26. #include <string>
  27. #include "base/base_export.h"
  28. #include "base/macros.h"
  29. namespace base {
  30. namespace win {
  31. // Utility class to make it easier to work with EVENT_TRACE_PROPERTIES.
  32. // The EVENT_TRACE_PROPERTIES structure contains information about an
  33. // event tracing session.
  34. class BASE_EXPORT EtwTraceProperties {
  35. public:
  36. EtwTraceProperties();
  37. EVENT_TRACE_PROPERTIES* get() { return &properties_; }
  38. const EVENT_TRACE_PROPERTIES* get() const {
  39. return reinterpret_cast<const EVENT_TRACE_PROPERTIES*>(&properties_);
  40. }
  41. const wchar_t* GetLoggerName() const {
  42. return reinterpret_cast<const wchar_t*>(buffer_ + get()->LoggerNameOffset);
  43. }
  44. // Copies logger_name to the properties structure.
  45. HRESULT SetLoggerName(const wchar_t* logger_name);
  46. const wchar_t* GetLoggerFileName() const {
  47. return reinterpret_cast<const wchar_t*>(buffer_ + get()->LogFileNameOffset);
  48. }
  49. // Copies logger_file_name to the properties structure.
  50. HRESULT SetLoggerFileName(const wchar_t* logger_file_name);
  51. // Max string len for name and session name is 1024 per documentation.
  52. static const size_t kMaxStringLen = 1024;
  53. // Properties buffer allocates space for header and for
  54. // max length for name and session name.
  55. static const size_t kBufSize =
  56. sizeof(EVENT_TRACE_PROPERTIES) + 2 * sizeof(wchar_t) * (kMaxStringLen);
  57. private:
  58. // The EVENT_TRACE_PROPERTIES structure needs to be overlaid on a
  59. // larger buffer to allow storing the logger name and logger file
  60. // name contiguously with the structure.
  61. union {
  62. public:
  63. // Our properties header.
  64. EVENT_TRACE_PROPERTIES properties_;
  65. // The actual size of the buffer is forced by this member.
  66. char buffer_[kBufSize];
  67. };
  68. DISALLOW_COPY_AND_ASSIGN(EtwTraceProperties);
  69. };
  70. // This class implements an ETW controller, which knows how to start and
  71. // stop event tracing sessions, as well as controlling ETW provider
  72. // log levels and enable bit masks under the session.
  73. class BASE_EXPORT EtwTraceController {
  74. public:
  75. EtwTraceController();
  76. ~EtwTraceController();
  77. // Start a session with given name and properties.
  78. HRESULT Start(const wchar_t* session_name, EtwTraceProperties* prop);
  79. // Starts a session tracing to a file with some default properties.
  80. HRESULT StartFileSession(const wchar_t* session_name,
  81. const wchar_t* logfile_path,
  82. bool realtime = false);
  83. // Starts a realtime session with some default properties.
  84. HRESULT StartRealtimeSession(const wchar_t* session_name, size_t buffer_size);
  85. // Enables "provider" at "level" for this session.
  86. // This will cause all providers registered with the GUID
  87. // "provider" to start tracing at the new level, systemwide.
  88. HRESULT EnableProvider(const GUID& provider,
  89. UCHAR level,
  90. ULONG flags = 0xFFFFFFFF);
  91. // Disables "provider".
  92. HRESULT DisableProvider(const GUID& provider);
  93. // Stops our session and retrieve the new properties of the session,
  94. // properties may be NULL.
  95. HRESULT Stop(EtwTraceProperties* properties);
  96. // Flushes our session and retrieve the current properties,
  97. // properties may be NULL.
  98. HRESULT Flush(EtwTraceProperties* properties);
  99. // Static utility functions for controlling
  100. // sessions we don't necessarily own.
  101. static HRESULT Start(const wchar_t* session_name,
  102. EtwTraceProperties* properties,
  103. TRACEHANDLE* session_handle);
  104. static HRESULT Query(const wchar_t* session_name,
  105. EtwTraceProperties* properties);
  106. static HRESULT Update(const wchar_t* session_name,
  107. EtwTraceProperties* properties);
  108. static HRESULT Stop(const wchar_t* session_name,
  109. EtwTraceProperties* properties);
  110. static HRESULT Flush(const wchar_t* session_name,
  111. EtwTraceProperties* properties);
  112. // Accessors.
  113. TRACEHANDLE session() const { return session_; }
  114. const wchar_t* session_name() const { return session_name_.c_str(); }
  115. private:
  116. std::wstring session_name_;
  117. TRACEHANDLE session_ = NULL;
  118. DISALLOW_COPY_AND_ASSIGN(EtwTraceController);
  119. };
  120. } // namespace win
  121. } // namespace base
  122. #endif // BASE_WIN_EVENT_TRACE_CONTROLLER_H_