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 // Trace events to track application performance. Events consist of a name 6 // a type (BEGIN, END or INSTANT), a tracking id and extra string data. 7 // In addition, the current process id, thread id, a timestamp down to the 8 // microsecond and a file and line number of the calling location. 9 // 10 // The current implementation logs these events into a log file of the form 11 // trace_<pid>.log where it's designed to be post-processed to generate a 12 // trace report. In the future, it may use another mechansim to facilitate 13 // real-time analysis. 14 15 #ifndef BASE_DEBUG_TRACE_EVENT_H_ 16 #define BASE_DEBUG_TRACE_EVENT_H_ 17 #pragma once 18 19 #include "build/build_config.h" 20 21 #if defined(OS_WIN) 22 // On Windows we always pull in an alternative implementation 23 // which logs to Event Tracing for Windows. 24 // 25 // Note that the Windows implementation is always enabled, irrespective the 26 // value of the CHROMIUM_ENABLE_TRACE_EVENT define. The Windows implementation 27 // is controlled by Event Tracing for Windows, which will turn tracing on only 28 // if there is someone listening for the events it generates. 29 #include "base/debug/trace_event_win.h" 30 #else // defined(OS_WIN) 31 32 #include <string> 33 34 #include "base/memory/scoped_ptr.h" 35 #include "base/memory/singleton.h" 36 #include "base/synchronization/lock.h" 37 #include "base/time.h" 38 #include "base/timer.h" 39 40 #ifndef CHROMIUM_ENABLE_TRACE_EVENT 41 #define TRACE_EVENT_BEGIN(name, id, extra) ((void) 0) 42 #define TRACE_EVENT_END(name, id, extra) ((void) 0) 43 #define TRACE_EVENT_INSTANT(name, id, extra) ((void) 0) 44 45 #else // CHROMIUM_ENABLE_TRACE_EVENT 46 // Use the following macros rather than using the TraceLog class directly as the 47 // underlying implementation may change in the future. Here's a sample usage: 48 // TRACE_EVENT_BEGIN("v8.run", documentId, scriptLocation); 49 // RunScript(script); 50 // TRACE_EVENT_END("v8.run", documentId, scriptLocation); 51 52 // Record that an event (of name, id) has begun. All BEGIN events should have 53 // corresponding END events with a matching (name, id). 54 #define TRACE_EVENT_BEGIN(name, id, extra) \ 55 base::debug::TraceLog::GetInstance()->Trace( \ 56 name, \ 57 base::debug::TraceLog::EVENT_BEGIN, \ 58 reinterpret_cast<const void*>(id), \ 59 extra, \ 60 __FILE__, \ 61 __LINE__) 62 63 // Record that an event (of name, id) has ended. All END events should have 64 // corresponding BEGIN events with a matching (name, id). 65 #define TRACE_EVENT_END(name, id, extra) \ 66 base::debug::TraceLog::GetInstance()->Trace( \ 67 name, \ 68 base::debug::TraceLog::EVENT_END, \ 69 reinterpret_cast<const void*>(id), \ 70 extra, \ 71 __FILE__, \ 72 __LINE__) 73 74 // Record that an event (of name, id) with no duration has happened. 75 #define TRACE_EVENT_INSTANT(name, id, extra) \ 76 base::debug::TraceLog::GetInstance()->Trace( \ 77 name, \ 78 base::debug::TraceLog::EVENT_INSTANT, \ 79 reinterpret_cast<const void*>(id), \ 80 extra, \ 81 __FILE__, \ 82 __LINE__) 83 #endif // CHROMIUM_ENABLE_TRACE_EVENT 84 85 namespace base { 86 87 class ProcessMetrics; 88 89 namespace debug { 90 91 class TraceLog { 92 public: 93 enum EventType { 94 EVENT_BEGIN, 95 EVENT_END, 96 EVENT_INSTANT 97 }; 98 99 static TraceLog* GetInstance(); 100 101 // Is tracing currently enabled. 102 static bool IsTracing(); 103 // Start logging trace events. 104 static bool StartTracing(); 105 // Stop logging trace events. 106 static void StopTracing(); 107 108 // Log a trace event of (name, type, id) with the optional extra string. 109 void Trace(const std::string& name, 110 EventType type, 111 const void* id, 112 const std::wstring& extra, 113 const char* file, 114 int line); 115 void Trace(const std::string& name, 116 EventType type, 117 const void* id, 118 const std::string& extra, 119 const char* file, 120 int line); 121 122 private: 123 // This allows constructor and destructor to be private and usable only 124 // by the Singleton class. 125 friend struct DefaultSingletonTraits<TraceLog>; 126 127 TraceLog(); 128 ~TraceLog(); 129 bool OpenLogFile(); 130 void CloseLogFile(); 131 bool Start(); 132 void Stop(); 133 void Heartbeat(); 134 void Log(const std::string& msg); 135 136 bool enabled_; 137 FILE* log_file_; 138 base::Lock file_lock_; 139 TimeTicks trace_start_time_; 140 #ifndef ANDROID 141 scoped_ptr<base::ProcessMetrics> process_metrics_; 142 #endif 143 RepeatingTimer<TraceLog> timer_; 144 }; 145 146 } // namespace debug 147 } // namespace base 148 149 #endif // defined(OS_WIN) 150 151 #endif // BASE_DEBUG_TRACE_EVENT_H_ 152