UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Trace.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Trace/Config.h"
6
7
8#include "Misc/Launder.h"
10
11#include <type_traits>
12
13namespace UE {
14namespace Trace {
15
16class FChannel;
17
18} // namespace Trace
19} // namespace UE
20
21#define TRACE_PRIVATE_EXPAND(x) x
22
23#if TRACE_PRIVATE_MINIMAL_ENABLED
24
25//------------------------------------------------------------------------------------------------
26//-- Private functional variants
27//------------------------------------------------------------------------------------------------
28
29#define TRACE_PRIVATE_STATISTICS (!(UE_BUILD_SHIPPING || USING_THREAD_SANITISER))
30
31#define TRACE_PRIVATE_CHANNEL_DEFAULT_ARGS false, "None"
32
33#define TRACE_PRIVATE_CHANNEL_DECLARE(LinkageType, ChannelName, ChannelClass) \
34 static_assert(std::is_base_of_v<UE::Trace::FChannel, ChannelClass>);\
35 static ChannelClass ChannelName##Object; \
36 LinkageType ChannelClass& ChannelName = ChannelName##Object;
37
38#define TRACE_PRIVATE_CHANNEL_IMPL(ChannelName, ...) \
39 struct F##ChannelName##Registrator \
40 { \
41 F##ChannelName##Registrator() \
42 { \
43 ChannelName##Object.Setup(#ChannelName, { __VA_ARGS__ } ); \
44 } \
45 }; \
46 static F##ChannelName##Registrator ChannelName##Reg = F##ChannelName##Registrator();
47
48#define TRACE_PRIVATE_CHANNEL(ChannelName, ...) \
49 TRACE_PRIVATE_CHANNEL_DECLARE(static, ChannelName, UE::Trace::FChannel) \
50 TRACE_PRIVATE_CHANNEL_IMPL(ChannelName, ##__VA_ARGS__)
51
52#define TRACE_PRIVATE_CHANNEL_CUSTOM(ChannelName, ChannelClass, ...) \
53 TRACE_PRIVATE_CHANNEL_DECLARE(static, ChannelName, ChannelClass) \
54 TRACE_PRIVATE_CHANNEL_IMPL(ChannelName, ##__VA_ARGS__)
55
56#define TRACE_PRIVATE_CHANNEL_DEFINE(ChannelName, ...) \
57 TRACE_PRIVATE_CHANNEL_DECLARE(, ChannelName, UE::Trace::FChannel) \
58 TRACE_PRIVATE_CHANNEL_IMPL(ChannelName, ##__VA_ARGS__)
59
60#define TRACE_PRIVATE_CHANNEL_CUSTOM_DEFINE(ChannelName, ChannelClass, ...) \
61 TRACE_PRIVATE_CHANNEL_DECLARE(, ChannelName, ChannelClass) \
62 TRACE_PRIVATE_CHANNEL_IMPL(ChannelName, ##__VA_ARGS__)
63
64#define TRACE_PRIVATE_CHANNEL_EXTERN(ChannelName, ...) \
65 __VA_ARGS__ extern UE::Trace::FChannel& ChannelName;
66
67#define TRACE_PRIVATE_CHANNEL_CUSTOM_EXTERN(ChannelName, ChannelClass, ...) \
68 __VA_ARGS__ extern class ChannelClass& ChannelName;
69
70#define TRACE_PRIVATE_CHANNELEXPR_IS_ENABLED(ChannelsExpr) \
71 bool(ChannelsExpr)
72
73#define TRACE_PRIVATE_EVENT_DEFINE(LoggerName, EventName) \
74 static UE::Trace::Private::FEventNode LoggerName##EventName##Event##Impl;\
75 UE::Trace::Private::FEventNode& LoggerName##EventName##Event = LoggerName##EventName##Event##Impl;
76
77#define TRACE_PRIVATE_EVENT_BEGIN(LoggerName, EventName, ...) \
78 TRACE_PRIVATE_EVENT_DEFINE(LoggerName, EventName); \
79 TRACE_PRIVATE_EVENT_BEGIN_IMPL(LoggerName, EventName, ##__VA_ARGS__)
80
81#define TRACE_PRIVATE_EVENT_BEGIN_EXTERN(LoggerName, EventName, ...) \
82 extern UE::Trace::Private::FEventNode& LoggerName##EventName##Event; \
83 TRACE_PRIVATE_EVENT_BEGIN_IMPL(LoggerName, EventName, ##__VA_ARGS__)
84
85#define TRACE_PRIVATE_EVENT_BEGIN_IMPL(LoggerName, EventName, ...) \
86 struct F##LoggerName##EventName##Fields \
87 { \
88 enum \
89 { \
90 Important = UE::Trace::Private::FEventInfo::Flag_Important, \
91 NoSync = UE::Trace::Private::FEventInfo::Flag_NoSync, \
92 Definition8bit = UE::Trace::Private::FEventInfo::Flag_Definition8, \
93 Definition16bit = UE::Trace::Private::FEventInfo::Flag_Definition16, \
94 Definition32bit = UE::Trace::Private::FEventInfo::Flag_Definition32, \
95 Definition64bit = UE::Trace::Private::FEventInfo::Flag_Definition64, \
96 DefinitionBits = UE::Trace::Private::FEventInfo::DefinitionBits, \
97 PartialEventFlags = (0, ##__VA_ARGS__), \
98 }; \
99 enum : bool { bIsImportant = ((0, ##__VA_ARGS__) & Important) != 0, bIsDefinition = ((0, ##__VA_ARGS__) & DefinitionBits) != 0,\
100 bIsDefinition8 = ((0, ##__VA_ARGS__) & Definition8bit) != 0, \
101 bIsDefinition16 = ((0, ##__VA_ARGS__) & Definition16bit) != 0,\
102 bIsDefinition32 = ((0, ##__VA_ARGS__) & Definition32bit) != 0, \
103 bIsDefinition64 = ((0, ##__VA_ARGS__) & Definition64bit) != 0,}; \
104 typedef std::conditional_t<bIsDefinition8, UE::Trace::FEventRef8, std::conditional_t<bIsDefinition16, UE::Trace::FEventRef16 , std::conditional_t<bIsDefinition64, UE::Trace::FEventRef64, UE::Trace::FEventRef32>>> DefinitionType;\
105 static constexpr uint32 GetSize() { return EventProps_Meta::Size; } \
106 static uint32 GetUid() { static uint32 Uid { Initialize() }; return Uid; } \
107 static uint32 FORCENOINLINE Initialize() \
108 { \
109 static const uint32 Uid_ThreadSafeInit = [] () \
110 { \
111 using namespace UE::Trace; \
112 static F##LoggerName##EventName##Fields Fields; \
113 static UE::Trace::Private::FEventInfo Info = \
114 { \
115 FLiteralName(#LoggerName), \
116 FLiteralName(#EventName), \
117 (FFieldDesc*)(&Fields), \
118 EventProps_Meta::NumFields, \
119 uint16(EventFlags), \
120 }; \
121 return LoggerName##EventName##Event.Initialize(&Info); \
122 }(); \
123 return Uid_ThreadSafeInit; \
124 } \
125 typedef UE::Trace::TField<0 /*Index*/, 0 /*Offset*/,
126
127#define TRACE_PRIVATE_EVENT_FIELD(FieldType, FieldName) \
128 FieldType> FieldName##_Meta; \
129 FieldName##_Meta const FieldName##_Field = UE::Trace::FLiteralName(#FieldName); \
130 template <typename... Ts> auto FieldName(Ts... ts) const { \
131 LogScopeType::FFieldSet<FieldName##_Meta, FieldType>::Impl((LogScopeType*)this, Forward<Ts>(ts)...); \
132 return true; \
133 } \
134 typedef UE::Trace::TField< \
135 FieldName##_Meta::Index + 1, \
136 FieldName##_Meta::Offset + FieldName##_Meta::Size,
137
138#define TRACE_PRIVATE_EVENT_REFFIELD(RefLogger, RefEventType, FieldName) \
139 F##RefLogger##RefEventType##Fields::DefinitionType> FieldName##_Meta; \
140 FieldName##_Meta const FieldName##_Field = FieldName##_Meta(UE::Trace::FLiteralName(#FieldName), RefLogger##RefEventType##Event.GetUid()); \
141 template <typename DefinitionType> auto FieldName(UE::Trace::TEventRef<DefinitionType> Reference) const { \
142 checkfSlow(Reference.RefTypeId == F##RefLogger##RefEventType##Fields::GetUid(), TEXT("Incorrect reference type passed to event. Field expected %s with uid %u but got a reference with uid %u"), TEXT(#RefEventType), F##RefLogger##RefEventType##Fields::GetUid(), Reference.RefTypeId);\
143 LogScopeType::FFieldSet<FieldName##_Meta, F##RefLogger##RefEventType##Fields::DefinitionType>::Impl((LogScopeType*)this, Reference); \
144 return true; \
145 } \
146 typedef UE::Trace::TField< \
147 FieldName##_Meta::Index + 1, \
148 FieldName##_Meta::Offset + FieldName##_Meta::Size,
149
150#define TRACE_PRIVATE_EVENT_END() \
151 std::conditional<bIsDefinition != 0, DefinitionType, UE::Trace::DisabledField>::type> DefinitionId_Meta;\
152 DefinitionId_Meta const DefinitionId_Field = UE::Trace::FLiteralName("");\
153 static constexpr uint16 NumDefinitionFields = (bIsDefinition != 0) ? 1 : 0;\
154 template<typename RefType>\
155 auto SetDefinitionId(const RefType& Id) const \
156 { \
157 LogScopeType::FFieldSet<DefinitionId_Meta, RefType>::Impl((LogScopeType*)this, Id); \
158 return true; \
159 } \
160 typedef UE::Trace::TField<DefinitionId_Meta::Index + NumDefinitionFields, DefinitionId_Meta::Offset + DefinitionId_Meta::Size, UE::Trace::EventProps> EventProps_Meta; \
161 EventProps_Meta const EventProps_Private = {}; \
162 static_assert(bIsImportant == 0 || TRACE_PRIVATE_ALLOW_IMPORTANTS, "Important events are disabled in this configuration.");\
163 typedef std::conditional<bIsImportant != 0, UE::Trace::Private::FImportantLogScope, UE::Trace::Private::FLogScope>::type LogScopeType; \
164 explicit operator bool () const { return true; } \
165 enum { EventFlags = PartialEventFlags|((EventProps_Meta::NumAuxFields != 0) ? UE::Trace::Private::FEventInfo::Flag_MaybeHasAux : 0), }; \
166 static_assert( \
167 (bIsImportant == 0) || (uint32(EventFlags) & uint32(UE::Trace::Private::FEventInfo::Flag_NoSync)), \
168 "Trace events flagged as Important events must be marked NoSync" \
169 ); \
170 };
171
172#define TRACE_PRIVATE_LOG_PRELUDE(EnterFunc, LoggerName, EventName, ChannelsExpr, ...) \
173 if (TRACE_PRIVATE_CHANNELEXPR_IS_ENABLED(ChannelsExpr)) \
174 if (auto LogScope = F##LoggerName##EventName##Fields::LogScopeType::EnterFunc<F##LoggerName##EventName##Fields>(__VA_ARGS__)) \
175 if (const auto& __restrict EventName = *UE_LAUNDER((F##LoggerName##EventName##Fields*)(&LogScope))) \
176 ((void)EventName),
177
178#define TRACE_PRIVATE_LOG_PRELUDE_CONDITIONAL(EnterFunc, LoggerName, EventName, ChannelsExpr, Condition, ...) \
179 if (Condition) \
180 TRACE_PRIVATE_LOG_PRELUDE(EnterFunc, LoggerName, EventName, ChannelsExpr, __VA_ARGS__)
181
182#define TRACE_PRIVATE_LOG_EPILOG() \
183 LogScope += LogScope
184
185#define TRACE_PRIVATE_LOG(LoggerName, EventName, ChannelsExpr, ...) \
186 TRACE_PRIVATE_LOG_PRELUDE(Enter, LoggerName, EventName, ChannelsExpr, ##__VA_ARGS__) \
187 TRACE_PRIVATE_LOG_EPILOG()
188
189#define TRACE_PRIVATE_LOG_SCOPED(LoggerName, EventName, ChannelsExpr, ...) \
190 UE::Trace::Private::FScopedLogScope PREPROCESSOR_JOIN(TheScope, __LINE__); \
191 TRACE_PRIVATE_LOG_PRELUDE(ScopedEnter, LoggerName, EventName, ChannelsExpr, ##__VA_ARGS__) \
192 PREPROCESSOR_JOIN(TheScope, __LINE__).SetActive(), \
193 TRACE_PRIVATE_LOG_EPILOG()
194
195#define TRACE_PRIVATE_LOG_SCOPED_CONDITIONAL(LoggerName, EventName, ChannelsExpr, Condition, ...) \
196 UE::Trace::Private::FScopedLogScope PREPROCESSOR_JOIN(TheScope, __LINE__); \
197 TRACE_PRIVATE_LOG_PRELUDE_CONDITIONAL(ScopedEnter, LoggerName, EventName, ChannelsExpr, Condition, ##__VA_ARGS__) \
198 PREPROCESSOR_JOIN(TheScope, __LINE__).SetActive(), \
199 TRACE_PRIVATE_LOG_EPILOG()
200
201#define TRACE_PRIVATE_LOG_SCOPED_T(LoggerName, EventName, ChannelsExpr, ...) \
202 UE::Trace::Private::FScopedStampedLogScope PREPROCESSOR_JOIN(TheScope, __LINE__); \
203 TRACE_PRIVATE_LOG_PRELUDE(ScopedStampedEnter, LoggerName, EventName, ChannelsExpr, ##__VA_ARGS__) \
204 PREPROCESSOR_JOIN(TheScope, __LINE__).SetActive(), \
205 TRACE_PRIVATE_LOG_EPILOG()
206
207#define TRACE_PRIVATE_LOG_SCOPED_T_CONDITIONAL(LoggerName, EventName, ChannelsExpr, Condition, ...) \
208 UE::Trace::Private::FScopedStampedLogScope PREPROCESSOR_JOIN(TheScope, __LINE__); \
209 TRACE_PRIVATE_LOG_PRELUDE_CONDITIONAL(ScopedStampedEnter, LoggerName, EventName, ChannelsExpr, Condition, ##__VA_ARGS__) \
210 PREPROCESSOR_JOIN(TheScope, __LINE__).SetActive(), \
211 TRACE_PRIVATE_LOG_EPILOG()
212
213#define TRACE_PRIVATE_GET_DEFINITION_TYPE_ID(LoggerName, EventName) \
214 F##LoggerName##EventName##Fields::GetUid()
215
216#define TRACE_PRIVATE_LOG_DEFINITION(LoggerName, EventName, Id, ChannelsExpr, ...) \
217 UE::Trace::MakeEventRef(Id, TRACE_PRIVATE_GET_DEFINITION_TYPE_ID(LoggerName, EventName)); \
218 TRACE_PRIVATE_LOG(LoggerName, EventName, ChannelsExpr, ##__VA_ARGS__) \
219 << EventName.SetDefinitionId(UE::Trace::MakeEventRef(Id, F##LoggerName##EventName##Fields::GetUid()))
220
221#endif // TRACE_PRIVATE_MINIMAL_ENABLED
222
223//------------------------------------------------------------------------------------------------
224//-- Private no op variants
225//------------------------------------------------------------------------------------------------
226
227#define TRACE_PRIVATE_NOP_CHANNEL(ChannelName, ...)
228
229#define TRACE_PRIVATE_NOP_CHANNEL_CUSTOM(ChannelName, ChannelClass, ...)
230
231#define TRACE_PRIVATE_NOP_CHANNEL_EXTERN(ChannelName, ...)
232
233#define TRACE_PRIVATE_NOP_CHANNEL_CUSTOM_EXTERN(ChannelName, ChannelClass, ...)
234
235#define TRACE_PRIVATE_NOP_CHANNEL_DEFINE(ChannelName, ...)
236
237#define TRACE_PRIVATE_NOP_CHANNEL_CUSTOM_DEFINE(ChannelName, ChannelClass, ...)
238
239#define TRACE_PRIVATE_NOP_CHANNELEXPR_IS_ENABLED(ChannelsExpr) \
240 false
241
242#define TRACE_PRIVATE_NOP_EVENT_DEFINE(LoggerName, EventName) \
243 int8* LoggerName##EventName##DummyPtr = nullptr;
244
245#define TRACE_PRIVATE_NOP_EVENT_BEGIN(LoggerName, EventName, ...) \
246 TRACE_PRIVATE_NOP_EVENT_BEGIN_IMPL(LoggerName, EventName)
247
248#define TRACE_PRIVATE_NOP_EVENT_BEGIN_EXTERN(LoggerName, EventName, ...) \
249 extern int8* LoggerName##EventName##DummyPtr; \
250 TRACE_PRIVATE_NOP_EVENT_BEGIN_IMPL(LoggerName, EventName)
251
252#define TRACE_PRIVATE_NOP_EVENT_BEGIN_IMPL(LoggerName, EventName) \
253 struct F##LoggerName##EventName##Dummy \
254 { \
255 enum \
256 { \
257 Important, \
258 NoSync, \
259 Definition8bit, \
260 Definition16bit, \
261 Definition32bit, \
262 Definition64bit, \
263 DefinitionBits, \
264 }; \
265 struct FTraceDisabled \
266 { \
267 const FTraceDisabled& operator () (...) const { return *this; } \
268 }; \
269 const F##LoggerName##EventName##Dummy& operator << (const FTraceDisabled&) const \
270 { \
271 return *this; \
272 } \
273 explicit operator bool () const { return false; }
274
275#define TRACE_PRIVATE_NOP_EVENT_FIELD(FieldType, FieldName) \
276 const FTraceDisabled& FieldName;
277
278#define TRACE_PRIVATE_NOP_EVENT_REFFIELD(RefLogger, RefEventType, FieldName) \
279 const FTraceDisabled& FieldName;
280
281#define TRACE_PRIVATE_NOP_EVENT_END() \
282 };
283
284#define TRACE_PRIVATE_NOP_LOG(LoggerName, EventName, ...) \
285 if (const auto& EventName = *(F##LoggerName##EventName##Dummy*)1) \
286 EventName
287
288#define TRACE_PRIVATE_NOP_LOG_SCOPED(LoggerName, EventName, ...) \
289 if (const auto& EventName = *(F##LoggerName##EventName##Dummy*)1) \
290 EventName
291
292#define TRACE_PRIVATE_NOP_LOG_SCOPED_CONDITIONAL(LoggerName, EventName, ...) \
293 if (const auto& EventName = *(F##LoggerName##EventName##Dummy*)1) \
294 EventName
295
296#define TRACE_PRIVATE_NOP_LOG_SCOPED_T(LoggerName, EventName, ...) \
297 if (const auto& EventName = *(F##LoggerName##EventName##Dummy*)1) \
298 EventName
299
300#define TRACE_PRIVATE_NOP_LOG_SCOPED_T_CONDITIONAL(LoggerName, EventName, ...) \
301 if (const auto& EventName = *(F##LoggerName##EventName##Dummy*)1) \
302 EventName
303
304#define TRACE_PRIVATE_NOP_GET_DEFINITION_TYPE_ID(LoggerName, EventName) \
305 0
306
307#define TRACE_PRIVATE_NOP_LOG_DEFINITION(LoggerName, EventName, Id, ChannelsExpr, ...) \
308 UE::Trace::MakeEventRef(Id, 0); \
309 TRACE_PRIVATE_NOP_LOG(LoggerName, EventName, ChannelsExpr, ##__VA_ARGS__)
@ Trace
Definition NetTraceConfig.h:23
Definition AdvancedWidgetsModule.cpp:13