UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ReferenceChainSearch.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
7#include "Containers/Map.h"
8#include "Containers/Set.h"
10#include "CoreMinimal.h"
11#include "CoreTypes.h"
12#include "HAL/PlatformCrt.h"
13#include "HAL/ThreadHeartBeat.h"
14#include "HAL/UnrealMemory.h"
16#include "Misc/EnumClassFlags.h"
17#include "Templates/TypeHash.h"
20#include "UObject/NameTypes.h"
24
25class FGCObjectInfo;
26class FOutputDevice;
27class UObject;
28struct FGCSnapshot;
29template <typename FuncType> class TFunctionRef;
30
33{
34 // Returns all reference chains found
35 Default = 0,
36 // Returns only reference chains from external objects
37 ExternalOnly = 1 << 0,
38 // Returns only the shortest reference chain for each rooted object
39 Shortest = 1 << 1,
40 // Returns only the longest reference chain for each rooted object
41 Longest = 1 << 2,
42 // Returns only the direct referencers
43 Direct = 1 << 3,
44 // Returns complete chains. (Ignoring non GC objects)
45 FullChain = 1 << 4,
46 // Returns the shortest path to a garbage object from which the target object is reachable
47 ShortestToGarbage = 1 << 5,
48 // Attempts to find a plausible path to the target object with minimal memory usage
49 // E.g. returns a direct external reference to the target object if one is found
50 // otherwise returns an external reference to an inner of the target object
51 Minimal = 1 << 6,
52 // Skips the disregard-for-GC set that will never be GCd and whose outgoing references are not checked during GC
53 GCOnly = 1 << 7,
54
55 // Print results
56 PrintResults = 1 << 16,
57 // Print ALL results (in some cases there may be thousands of reference chains)
58 PrintAllResults = 1 << 17,
59};
60
62
64{
65 // Reference chain searching is a very slow operation.
66 // Suspend the hang and hitch detectors for the lifetime of this instance.
67 FSlowHeartBeatScope SuspendHeartBeat;
68 FDisableHitchDetectorScope SuspendGameThreadHitch;
69
70public:
71
73 enum class EReferenceType
74 {
75 Unknown = 0,
76 Property = 1,
78 OuterChain = 3,
79 };
80
82 template<typename T>
84 {
85 // Maximum number of stack frames to keep for AddReferencedObjects function calls
86 static constexpr uint32 MaxStackFrames = 30;
87
89 T* Object = nullptr;
95
101
103 TReferenceInfo(T* InObject)
104 : Object(InObject)
106 {
107 }
108
111 T* InObject,
113 FString InReferencerName,
115 )
116 : Object(InObject)
118 , Type(InType)
120 {
121 }
122
125
127 {
128 return Object == Other.Object;
129 }
130
132 {
133 return GetTypeHash(Info.Object);
134 }
135
137 FString ToString() const
138 {
140 {
141 return FString::Printf(TEXT("->%s"), *ReferencerName);
142 }
144 {
145 if (!ReferencerName.IsEmpty())
146 {
147 return FString::Printf(TEXT("::AddReferencedObjects(): %s"), *ReferencerName);
148 }
149 else
150 {
151 return TEXT("::AddReferencedObjects()");
152 }
153 }
154 return FString();
155 }
156 };
157
158 struct FGraphNode;
159
163
166 {
168 UE_DEPRECATED(5.0, "Direct Object reference has been deprecated. Use ObjectInfo member variable instead.")
169 UObject* Object = nullptr;
178
180 {
181 return ReferencedObjects.GetAllocatedSize() + ReferencedByObjects.GetAllocatedSize();
182 }
183 };
184
185
188 {
190
192 FGraphNode* TargetNode = nullptr;
193
198
200 void FillReferenceInfo();
201
202 public:
208
215
217 {
218 return Nodes.GetAllocatedSize() + ReferenceInfos.GetAllocatedSize();
219 }
220
223 {
224 Nodes.Add(InNode);
225 }
227 {
228 Nodes.Insert(InNode, 0);
229 }
231 FGraphNode* GetNode(int32 NodeIndex) const
232 {
233 return Nodes[NodeIndex];
234 }
236 {
237 if (Nodes.Last() == Exclude && Nodes.Num() > 2)
238 {
239 return Nodes[Nodes.Num()-2];
240 }
241
242 return Nodes.Last();
243 }
245 {
246 return Nodes.Last();
247 }
249 int32 Num() const
250 {
251 return Nodes.Num();
252 }
255 {
257 return NewChain;
258 }
260 bool Contains(const FGraphNode* InNode) const
261 {
262 return Nodes.Contains(InNode);
263 }
266 {
267 return ReferenceInfos[NodeIndex];
268 }
270 bool IsExternal() const;
271 };
272
287
295
298
301
302#if ENABLE_GC_HISTORY
306#endif //ENABLE_GC_HISTORY
307
313 COREUOBJECT_API int32 PrintResults(bool bDumpAllChains = false, UObject* TargetObject = nullptr, ELogVerbosity::Type VerbosityForPrint = ELogVerbosity::Log) const;
315
322 COREUOBJECT_API int32 PrintResults(TFunctionRef<bool(FCallbackParams& Params)> ReferenceCallback, bool bDumpAllChains = false, UObject* TargetObject = nullptr, ELogVerbosity::Type VerbosityForPrint = ELogVerbosity::Log) const;
323
325 COREUOBJECT_API FString GetRootPath(UObject* TargetObject = nullptr) const;
326
331 COREUOBJECT_API FString GetRootPath(TFunctionRef<bool(FCallbackParams& Params)> ReferenceCallback, UObject* TargetObject = nullptr) const;
332
335 {
336 return ReferenceChains;
337 }
338
339 int64 GetAllocatedSize() const;
340
348private:
349
351 TArray<FGCObjectInfo*> ObjectInfosToFindReferencesTo;
352
355
357 TArray<FReferenceChain*> ReferenceChains;
358
363
364 ELogVerbosity::Type VerbosityForPrint = ELogVerbosity::Log;
365
367 void Cleanup();
368
370 void LinkNodes(
371 UObject* From,
372 UObject* To,
373 EReferenceType ReferenceType,
375 TConstArrayView<uint64> StackFrames = {});
376 void LinkNodes(
377 FGCObjectInfo* From,
378 FGCObjectInfo* To,
379 EReferenceType ReferenceType,
381 TConstArrayView<uint64> StackFrames = {});
382
383public:
385 static FString GetObjectFlags(const FGCObjectInfo& InObject);
386private:
387
389 static void DumpChain(FReferenceChainSearch::FReferenceChain* Chain, TFunctionRef<bool(FCallbackParams& Params)> ReferenceCallback,
391};
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
EPrintStaleReferencesOptions
Definition PrintStaleReferencesOptions.h:10
EReferenceChainSearchMode
Definition ReferenceChainSearch.h:33
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GCObjectInfo.h:28
Definition NameTypes.h:617
Definition OutputDevice.h:133
Definition ReferenceChainSearch.h:188
FReferenceChain * Split()
Definition ReferenceChainSearch.h:254
bool Contains(const FGraphNode *InNode) const
Definition ReferenceChainSearch.h:260
void InsertNode(FGraphNode *InNode)
Definition ReferenceChainSearch.h:226
FReferenceChain(FGraphNode *InTargetNode, TArray< FGraphNode * > InNodes, TArray< const FNodeReferenceInfo * > InReferenceInfos)
Definition ReferenceChainSearch.h:209
FGraphNode * GetRootNode() const
Definition ReferenceChainSearch.h:244
void AddNode(FGraphNode *InNode)
Definition ReferenceChainSearch.h:222
FGraphNode * GetRootNode(FGraphNode *Exclude) const
Definition ReferenceChainSearch.h:235
FGraphNode * GetNode(int32 NodeIndex) const
Definition ReferenceChainSearch.h:231
FReferenceChain(int32 ReserveDepth)
Definition ReferenceChainSearch.h:204
bool IsExternal() const
Definition ReferenceChainSearch.cpp:1542
const FNodeReferenceInfo * GetReferenceInfo(int32 NodeIndex) const
Definition ReferenceChainSearch.h:265
FReferenceChain()
Definition ReferenceChainSearch.h:203
int64 GetAllocatedSize() const
Definition ReferenceChainSearch.h:216
int32 Num() const
Definition ReferenceChainSearch.h:249
Definition ReferenceChainSearch.h:64
const TArray< FReferenceChain * > & GetReferenceChains() const
Definition ReferenceChainSearch.h:334
EReferenceType
Definition ReferenceChainSearch.h:74
int64 GetAllocatedSize() const
Definition ReferenceChainSearch.cpp:1607
static FString GetObjectFlags(const FGCObjectInfo &InObject)
Definition ReferenceChainSearch.cpp:1264
COREUOBJECT_API FString GetRootPath(UObject *TargetObject=nullptr) const
Definition ReferenceChainSearch.cpp:1780
TReferenceInfo< FGraphNode > FNodeReferenceInfo
Definition ReferenceChainSearch.h:162
COREUOBJECT_API void SetVerbosityForPrint(ELogVerbosity::Type Verbosity)
Definition ReferenceChainSearch.cpp:1683
TReferenceInfo< FGCObjectInfo > FObjectReferenceInfo
Definition ReferenceChainSearch.h:161
static COREUOBJECT_API TArray< FString > FindAndPrintStaleReferencesToObjects(TConstArrayView< UObject * > ObjectsToFindReferencesTo, EPrintStaleReferencesOptions Options)
Definition ReferenceChainSearch.cpp:1908
static COREUOBJECT_API FString FindAndPrintStaleReferencesToObject(UObject *ObjectToFindReferencesTo, EPrintStaleReferencesOptions Options)
Definition ReferenceChainSearch.cpp:1903
COREUOBJECT_API ~FReferenceChainSearch()
Definition ReferenceChainSearch.cpp:1602
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
bool Contains(const ComparisonType &Item) const
Definition Array.h:1518
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
SizeType Insert(std::initializer_list< ElementType > InitList, const SizeType InIndex)
Definition Array.h:1875
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition Object.h:95
Type
Definition LogVerbosity.h:17
@ Log
Definition LogVerbosity.h:40
Definition ThreadHeartBeat.h:424
Definition ReferenceChainSearch.h:275
int32 Indent
Definition ReferenceChainSearch.h:283
FGCObjectInfo * Referencer
Definition ReferenceChainSearch.h:279
const FNodeReferenceInfo * ReferenceInfo
Definition ReferenceChainSearch.h:281
FGCObjectInfo * Object
Definition ReferenceChainSearch.h:277
FOutputDevice * Out
Definition ReferenceChainSearch.h:285
Definition ReferenceChainSearch.h:166
UObject * Object
Definition ReferenceChainSearch.h:169
FGCObjectInfo * ObjectInfo
Definition ReferenceChainSearch.h:171
int64 GetAllocatedSize() const
Definition ReferenceChainSearch.h:179
int32 Visited
Definition ReferenceChainSearch.h:177
TSet< FNodeReferenceInfo > ReferencedObjects
Definition ReferenceChainSearch.h:173
TSet< FGraphNode * > ReferencedByObjects
Definition ReferenceChainSearch.h:175
Definition ReferenceChainSearch.h:84
bool operator==(const TReferenceInfo &Other) const
Definition ReferenceChainSearch.h:126
EReferenceType Type
Definition ReferenceChainSearch.h:92
TReferenceInfo(T *InObject)
Definition ReferenceChainSearch.h:103
FString ToString() const
Definition ReferenceChainSearch.h:137
TReferenceInfo & operator=(TReferenceInfo &&)=default
TReferenceInfo()
Definition ReferenceChainSearch.h:97
T * Object
Definition ReferenceChainSearch.h:89
TArray< uint64 > StackFrames
Definition ReferenceChainSearch.h:90
TReferenceInfo(T *InObject, EReferenceType InType, FString InReferencerName, TConstArrayView< uint64 > InStackFrames={})
Definition ReferenceChainSearch.h:110
TReferenceInfo(TReferenceInfo &&)=default
static constexpr uint32 MaxStackFrames
Definition ReferenceChainSearch.h:86
FString ReferencerName
Definition ReferenceChainSearch.h:94
friend uint32 GetTypeHash(const TReferenceInfo &Info)
Definition ReferenceChainSearch.h:131
Definition ThreadHeartBeat.h:265