UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ArchiveStackTrace.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"
9#include "HAL/Platform.h"
10#include "HAL/PlatformCrt.h"
16#include "Templates/UniquePtr.h"
17#include "UObject/NameTypes.h"
18#include "UObject/UnrealNames.h"
19
20class FLinkerLoad;
21class FProperty;
23class UObject;
24
44
53
64
66{
67
69{
70 uint8* Data = nullptr;
74};
75
77{
78 void operator()(void* Ptr) const
79 {
80 FMemory::Free(Ptr);
81 }
82};
83
87
91
92} // namespace UE::ArchiveStackTrace
93
94struct
95// Deprecated: 5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
97{
101 : Offset(0)
102 , Size(0)
103 {
104 }
106 : Offset(InOffset)
107 , Size(InSize)
108 {
109 }
111 {
112 return Offset == InOther.Offset;
113 }
115 {
116 return Offset < InOther.Offset;
117 }
119 {
120 Ar << InDiffInfo.Offset;
121 Ar << InDiffInfo.Size;
122 return Ar;
123 }
124};
125
126class
127UE_DEPRECATED(5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
128FArchiveDiffMap : public TArray<FArchiveDiffInfo>
129{
130public:
131 bool ContainsOffset(int64 Offset) const;
132};
133
134class
135UE_DEPRECATED(5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
137{
138public:
141 {
145 uint32 Callstack = 0;
147 bool bIgnore = false;
148 };
149
176
178
180 COREUOBJECT_API FName GetAssetClass() const;
181
183 int32 Num() const
184 {
185 return CallstackAtOffsetMap.Num();
186 }
187
189 COREUOBJECT_API void Add(
192 UObject* SerializedObject,
193 FProperty* SerializedProperty,
197 int32 StackIgnoreCount);
198
201
203 COREUOBJECT_API int32 GetCallstackIndexAtOffset(int64 Offset, int32 MinOffsetIndex = 0) const;
204
207 {
208 return CallstackAtOffsetMap[CallstackIndex];
209 }
210
212 {
213 return UniqueCallstacks[CallstackOffset.Callstack];
214 }
215
218 {
219 if (InOffsetIndex < CallstackAtOffsetMap.Num() - 1)
220 {
221 return CallstackAtOffsetMap[InOffsetIndex + 1].Offset - CallstackAtOffsetMap[InOffsetIndex].Offset;
222 }
223 else
224 {
225 return TotalSize - CallstackAtOffsetMap[InOffsetIndex].Offset;
226 }
227 }
228
231 {
232 return TotalSize;
233 }
234
235private:
237 COREUOBJECT_API ANSICHAR* AddUniqueCallstack(bool bIsCollectingCallstacks, UObject* SerializedObject, FProperty* SerializedProperty, uint32& OutCallstackCRC);
238
240 UObject* Asset;
242 TArray<FCallstackAtOffset> CallstackAtOffsetMap;
244 TMap<uint32, FCallstackData> UniqueCallstacks;
246 bool bCallstacksDirty;
248 const SIZE_T StackTraceSize;
250 TUniquePtr<ANSICHAR[]> StackTrace;
252 ANSICHAR* LastSerializeCallstack;
254 int64 TotalSize;
255};
256
257class
258UE_DEPRECATED(5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
261{
262public:
264
268 const FArchiveDiffMap* InDiffMap = nullptr,
270
272
273 COREUOBJECT_API FORCENOINLINE virtual void Serialize(void* Data, int64 Length) override; // FORCENOINLINE so it can be counted during StackTrace
274
275#if WITH_EDITOR
276 virtual void PushDebugDataString(const FName& DebugData) override
277 {
278 DebugDataStack.Push(DebugData);
279 }
280
281 virtual void PopDebugDataString() override
282 {
283 DebugDataStack.Pop();
284 }
285#endif
286
288 {
289 static FArchiveDiffMap Empty;
290 return DiffMap != nullptr ? *DiffMap : Empty;
291 }
292
294 {
295 bInnerArchiveDisabled = bDisable;
296 }
297
298 int32 GetStackIgnoreCount() const { return StackIgnoreCount; }
299 void SetStackIgnoreCount(const int32 IgnoreCount) { StackIgnoreCount = IgnoreCount; }
300
302 {
303 uint8* Data = nullptr;
305 int64 HeaderSize = 0;
306 int64 StartOffset = 0;
307 };
308
310
312 static COREUOBJECT_API void Compare(
314 const FPackageData& DestPackage,
316 const FArchiveDiffMap& DiffMap,
317 const TCHAR* AssetFilename,
319 const int64 MaxDiffsToLog,
322 bool bSuppressLogging = false);
323
325 static COREUOBJECT_API bool GenerateDiffMap(
327 const FPackageData& DestPackage,
331
333 static COREUOBJECT_API void DumpPackageHeaderDiffs(
335 const FPackageData& DestPackage,
336 const FString& AssetFilename,
337 const int32 MaxDiffsToLog,
338 const EPackageHeaderFormat PackageHeaderFormat = EPackageHeaderFormat::PackageFileSummary);
339
341 static COREUOBJECT_API FLinkerLoad* CreateLinkerForPackage(
342 FUObjectSerializeContext* LoadContext,
343 const FString& InPackageName,
344 const FString& InFilename,
345 const FPackageData& PackageData);
346
347private:
349 const FArchiveDiffMap* DiffMap;
350#if WITH_EDITOR
352#endif
353 int64 DiffMapOffset;
354 int32 StackIgnoreCount = 2;
355 bool bInnerArchiveDisabled;
356
358
359};
360
361class
362UE_DEPRECATED(5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
365{
366public:
367
369
372 const FArchiveDiffMap* DiffMap = nullptr,
373 const int64 DiffMapOffset = 0,
374 const int64 PreAllocateBytes = 0,
375 bool bIsPersistent = false,
376 const TCHAR* Filename = nullptr);
377
378 COREUOBJECT_API FORCENOINLINE virtual void Serialize(void* Memory, int64 Length) override; // FORCENOINLINE so it can be counted during StackTrace
379
380private:
381 FArchiveStackTraceWriter StackTraceWriter;
382
384};
385
390class
391UE_DEPRECATED(5.3, "FArchiveStackTrace was only used by DiffPackageWriter, and has been moved into a private helper class. Contact Epic if you need this class for another reason.")
394{
395public:
397
399
402
404 {
405 return Callstacks;
406 }
407
409 {
410 return Callstacks;
411 }
412
413 COREUOBJECT_API FORCENOINLINE virtual void Serialize(void* Memory, int64 Length) override; // FORCENOINLINE so it can be counted during StackTrace
414
416 COREUOBJECT_API void CompareWith(const TCHAR* InFilename, const int64 TotalHeaderSize, const TCHAR* CallstackCutoffText,
418 COREUOBJECT_API void CompareWith(const FPackageData& SourcePackage, const TCHAR* FileDisplayName, const int64 TotalHeaderSize,
420 const FArchiveStackTraceWriter::EPackageHeaderFormat PackageHeaderFormat = FArchiveStackTraceWriter::EPackageHeaderFormat::PackageFileSummary);
421
423 COREUOBJECT_API bool GenerateDiffMap(const TCHAR* InFilename, int64 TotalHeaderSize, int32 MaxDiffsToFind, FArchiveDiffMap& OutDiffMap);
424 COREUOBJECT_API bool GenerateDiffMap(const FPackageData& SourcePackage, int64 TotalHeaderSize, int32 MaxDiffsToFind,
426
428 static COREUOBJECT_API bool IsIdentical(const TCHAR* InFilename, int64 BufferSize, const uint8* BufferData);
429 static COREUOBJECT_API bool IsIdentical(const FPackageData& SourcePackage, int64 BufferSize, const uint8* BufferData);
430
432 static COREUOBJECT_API bool LoadPackageIntoMemory(const TCHAR* InFilename, FPackageData& OutPackageData,
434
435private:
437 FArchiveStackTraceWriter StackTraceWriter;
438
440};
441
443{
444public:
446 {
448 : Offset(0)
449 , Size(0)
450 , Count(0)
451 , Object(nullptr)
453 {}
461
463 {
464 // Return whether this and other are neighboring bits of data for the serialization of the same instance of an object\property
465 return Object == Other.Object && PropertyName == Other.PropertyName &&
466 (Offset == Other.Offset || (Offset + Size) == Other.Offset); // This is to merge contiguous blocks
467 }
468 };
469private:
470 TArray<FSerializeData> SerializeTrace;
472 FUObjectThreadContext& ThreadContext;
473public:
474
476
477 COREUOBJECT_API virtual void Serialize(void* OutData, int64 Num) override;
479 {
480 return SerializeTrace;
481 }
483};
#define FORCENOINLINE
Definition AndroidPlatform.h:142
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
@ Num
Definition MetalRHIPrivate.h:234
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ArchiveStackTrace.h:137
const FCallstackAtOffset & GetCallstack(int32 CallstackIndex) const
Definition ArchiveStackTrace.h:206
const FCallstackData & GetCallstackData(const FCallstackAtOffset &CallstackOffset) const
Definition ArchiveStackTrace.h:211
int32 Num() const
Definition ArchiveStackTrace.h:183
int64 TotalCapturedSize() const
Definition ArchiveStackTrace.h:230
int64 GetSerializedDataSizeForOffsetIndex(int32 InOffsetIndex) const
Definition ArchiveStackTrace.h:217
Definition ArchiveStackTrace.h:129
Definition ArchiveProxy.h:19
Definition ArchiveStackTrace.h:59
COREUOBJECT_API ~FArchiveStackTraceDisabledScope()
Definition ArchiveStackTrace.cpp:111
COREUOBJECT_API FArchiveStackTraceDisabledScope()
Definition ArchiveStackTrace.cpp:106
Definition ArchiveStackTrace.h:47
COREUOBJECT_API ~FArchiveStackTraceIgnoreScope()
Definition ArchiveStackTrace.cpp:98
Definition ArchiveStackTrace.h:365
PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition ArchiveStackTrace.h:368
Definition ArchiveStackTrace.h:443
static COREUOBJECT_API FArchiveStackTraceReader * CreateFromFile(const TCHAR *InFilename)
Definition ArchiveStackTrace.cpp:1708
const TArray< FSerializeData > & GetSerializeTrace() const
Definition ArchiveStackTrace.h:478
Definition ArchiveStackTrace.h:261
const FArchiveDiffMap & GetDiffMap() const
Definition ArchiveStackTrace.h:287
int32 GetStackIgnoreCount() const
Definition ArchiveStackTrace.h:298
void SetDisableInnerArchive(bool bDisable)
Definition ArchiveStackTrace.h:293
virtual COREUOBJECT_API ~FArchiveStackTraceWriter() override
void SetStackIgnoreCount(const int32 IgnoreCount)
Definition ArchiveStackTrace.h:299
PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition ArchiveStackTrace.h:263
Definition ArchiveStackTrace.h:394
PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition ArchiveStackTrace.h:396
const FArchiveCallstacks & GetCallstacks() const
Definition ArchiveStackTrace.h:408
FArchiveCallstacks & GetCallstacks()
Definition ArchiveStackTrace.h:403
Definition Archive.h:1208
Definition LargeMemoryReader.h:25
Definition LargeMemoryWriter.h:17
Definition LinkerLoad.h:124
Definition NameTypes.h:617
Definition UnrealType.h:174
Definition UObjectThreadContext.h:39
EPackageHeaderFormat
Definition PackageWriter.h:329
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
Definition Object.h:95
Definition Linker.cpp:38
Definition ArchiveStackTrace.cpp:117
bool ShouldIgnoreDiff()
Definition ArchiveStackTrace.cpp:175
bool LoadPackageIntoMemory(const TCHAR *InFilename, UE::ArchiveStackTrace::FPackageData &OutPackageData, TUniquePtr< uint8, FDeleteByFree > &OutLoadedBytes)
Definition ArchiveStackTrace.cpp:119
bool ShouldBypassDiff()
Definition ArchiveStackTrace.cpp:179
void ForceKillPackageAndLinker(FLinkerLoad *Linker)
Definition ArchiveStackTrace.cpp:163
Definition ArchiveStackTrace.h:141
Definition ArchiveStackTrace.h:152
FString SerializedObjectName
Definition ArchiveStackTrace.h:156
FCallstackData & operator=(FCallstackData &&)=default
TUniquePtr< ANSICHAR[]> Callstack
Definition ArchiveStackTrace.h:154
FCallstackData(const FCallstackData &)=delete
FCallstackData & operator=(const FCallstackData &)=delete
FCallstackData(FCallstackData &&)=default
FString SerializedPropertyName
Definition ArchiveStackTrace.h:160
Definition ArchiveStackTrace.h:97
bool operator==(const FArchiveDiffInfo &InOther) const
Definition ArchiveStackTrace.h:110
FArchiveDiffInfo()
Definition ArchiveStackTrace.h:100
bool operator<(const FArchiveDiffInfo &InOther) const
Definition ArchiveStackTrace.h:114
int64 Offset
Definition ArchiveStackTrace.h:98
int64 Size
Definition ArchiveStackTrace.h:99
FArchiveDiffInfo(int64 InOffset, int64 InSize)
Definition ArchiveStackTrace.h:105
Definition ArchiveStackTrace.h:27
FArchiveDiffStats()
Definition ArchiveStackTrace.h:37
int64 NumDiffs
Definition ArchiveStackTrace.h:31
int64 DiffSize
Definition ArchiveStackTrace.h:29
int64 OriginalFileTotalSize
Definition ArchiveStackTrace.h:33
int64 NewFileTotalSize
Definition ArchiveStackTrace.h:35
Definition ArchiveStackTrace.h:446
FString FullPropertyName
Definition ArchiveStackTrace.h:460
UObject * Object
Definition ArchiveStackTrace.h:458
int64 Size
Definition ArchiveStackTrace.h:456
FName PropertyName
Definition ArchiveStackTrace.h:459
int64 Offset
Definition ArchiveStackTrace.h:455
bool IsContiguousSerialization(const FSerializeData &Other) const
Definition ArchiveStackTrace.h:462
int64 Count
Definition ArchiveStackTrace.h:457
FSerializeData()
Definition ArchiveStackTrace.h:447
Definition ArchiveStackTrace.h:302
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition UObjectThreadContext.h:140
Definition ArchiveStackTrace.h:77
void operator()(void *Ptr) const
Definition ArchiveStackTrace.h:78
Definition ArchiveStackTrace.h:69
int64 HeaderSize
Definition ArchiveStackTrace.h:72
uint8 * Data
Definition ArchiveStackTrace.h:70
int64 StartOffset
Definition ArchiveStackTrace.h:73
int64 Size
Definition ArchiveStackTrace.h:71