15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the Windows-specific declarations for trace_event.h. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_DEBUG_TRACE_EVENT_WIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_DEBUG_TRACE_EVENT_WIN_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_provider.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fwd. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct StaticMemorySingletonTraits; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace debug { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This EtwTraceProvider subclass implements ETW logging 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the macros above on Windows. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TraceEventETWProvider : public base::win::EtwTraceProvider { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start logging trace events. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a noop in this implementation. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool StartTracing(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trace begin/end/instant events, this is the bottleneck implementation 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all the others defer to. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allowing the use of std::string for name or extra is a convenience, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whereas passing name or extra as a const char* avoids the construction 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of temporary std::string instances. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If -1 is passed for name_len or extra_len, the strlen of the string will 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be used for length. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Trace(const char* name, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t name_len, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char type, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* extra, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t extra_len); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows passing extra as a std::string for convenience. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Trace(const char* name, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char type, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extra) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Trace(name, -1, type, id, extra.c_str(), extra.length()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows passing extra as a const char* to avoid constructing temporary 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // std::string instances where not needed. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Trace(const char* name, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char type, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* extra) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Trace(name, -1, type, id, extra, -1); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieves the singleton. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this may return NULL post-AtExit processing. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static TraceEventETWProvider* GetInstance(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true iff tracing is turned on. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsTracing() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enable_level() >= TRACE_LEVEL_INFORMATION; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Emit a trace of type |type| containing |name|, |id|, and |extra|. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: |name| and |extra| must be NULL, or a zero-terminated string of 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // length |name_len| or |extra_len| respectively. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: if name_len or extra_len are -1, the length of the corresponding 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // string will be used. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TraceEvent(const char* name, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t name_len, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char type, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* id, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* extra, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t extra_len); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exposed for unittesting only, allows resurrecting our 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // singleton instance post-AtExit processing. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Resurrect(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure only the provider can construct us. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct StaticMemorySingletonTraits<TraceEventETWProvider>; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEventETWProvider(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TraceEventETWProvider); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW trace provider GUID. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kChromeTraceProviderName; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event class GUID for 32 bit events. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kTraceEventClass32; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event class GUID for 64 bit events. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kTraceEventClass64; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event types, IDs 0x00-0x09 are reserved, so start at 0x10. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeBegin = 0x10; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeEnd = 0x11; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeInstant = 0x12; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If this flag is set in enable flags 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TraceEventETWFlags { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CAPTURE_STACK_TRACE = 0x0001, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The event format consists of: 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "name" string as a zero-terminated ASCII string. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The id pointer in the machine bitness. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "extra" string as a zero-terminated ASCII string. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Optionally the stack trace, consisting of a DWORD "depth", followed 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by an array of void* (machine bitness) of length "depth". 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace debug 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_DEBUG_TRACE_EVENT_WIN_H_ 124