UE5でGarbageCollection.cppによりパッケージ化が失敗した時の備忘録

## 本記事の環境
- UE5.2.1
- Windows11 24H2
- メモリ(64GB)
- Visual Studio 2022

## 何が起きたか
Development向けのパッケージ化を行ったところ、下記のエラーログが発生
```
UATHelper: Packaging (Windows): LogUObjectArray: Warning: Empty slot
UATHelper: Packaging (Windows): LogOutputDevice: Warning:
UATHelper: Packaging (Windows): Script Stack (0 frames) :
PackagingResults: Warning: Empty slot
UATHelper: Packaging (Windows): LogWindows: Error: appError called: Assertion failed: Object->IsValidLowLevel() [File:D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp] [Line: 2914]
PackagingResults: Error: appError called: Assertion failed: Object->IsValidLowLevel() [File:D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp] [Line: 2914]
UATHelper: Packaging (Windows): LogWindows: Error: begin: stack for UAT
UATHelper: Packaging (Windows): LogWindows: Error: === Critical error: ===
UATHelper: Packaging (Windows): LogWindows: Error:
UATHelper: Packaging (Windows): LogWindows: Error: Assertion failed: Object->IsValidLowLevel() [File:D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp] [Line: 2914]
UATHelper: Packaging (Windows): LogWindows: Error:
UATHelper: Packaging (Windows): LogWindows: Error:
UATHelper: Packaging (Windows): LogWindows: Error:
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffdef50acea UnrealEditor-CoreUObject.dll!FReferenceFinder::HandleObjectReference() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp:2914]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffdef4cca8f UnrealEditor-CoreUObject.dll!UObject::AddReferencedObjects() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp:4454]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde0bab6f4 UnrealEditor-UnrealEd.dll!UE::Cook::ConstructObjectGraph() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:498]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde0bac27c UnrealEditor-UnrealEd.dll!UE::Cook::ConstructObjectGraphProfileData() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:583]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde0bb223b UnrealEditor-UnrealEd.dll!UE::Cook::DumpObjClassList() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:685]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde0c3fafe UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::EvaluateGarbageCollectionResults() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\CookOnTheFlyServer.cpp:5010]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde09c0eaf UnrealEditor-UnrealEd.dll!UCookCommandlet::ConditionalCollectGarbage() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:656]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde09c5320 UnrealEditor-UnrealEd.dll!UCookCommandlet::CookByTheBook() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:503]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ffde09e43b1 UnrealEditor-UnrealEd.dll!UCookCommandlet::Main() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:242]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93dd0de UnrealEditor-Cmd.exe!FEngineLoop::PreInitPostStartupScreen() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:4127]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93d454b UnrealEditor-Cmd.exe!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:140]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93d482a UnrealEditor-Cmd.exe!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93d74f0 UnrealEditor-Cmd.exe!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93ea4c4 UnrealEditor-Cmd.exe!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:284]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007ff6a93ecb76 UnrealEditor-Cmd.exe!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007fff9852e8d7 KERNEL32.DLL!UnknownFunction []
UATHelper: Packaging (Windows): LogWindows: Error: [Callstack] 0x00007fff991bbf2c ntdll.dll!UnknownFunction []
UATHelper: Packaging (Windows): LogWindows: Error:
UATHelper: Packaging (Windows): LogWindows: Error: end: stack for UAT
PackagingResults: Error: begin: stack for UAT
PackagingResults: Error: === Critical error: ===
PackagingResults: Error: Assertion failed: Object->IsValidLowLevel() [File:D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp] [Line: 2914]
PackagingResults: Error: [Callstack] 0x00007ffdef50acea UnrealEditor-CoreUObject.dll!FReferenceFinder::HandleObjectReference() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp:2914]
PackagingResults: Error: [Callstack] 0x00007ffdef4cca8f UnrealEditor-CoreUObject.dll!UObject::AddReferencedObjects() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollection.cpp:4454]
PackagingResults: Error: [Callstack] 0x00007ffde0bab6f4 UnrealEditor-UnrealEd.dll!UE::Cook::ConstructObjectGraph() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:498]
PackagingResults: Error: [Callstack] 0x00007ffde0bac27c UnrealEditor-UnrealEd.dll!UE::Cook::ConstructObjectGraphProfileData() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:583]
PackagingResults: Error: [Callstack] 0x00007ffde0bb223b UnrealEditor-UnrealEd.dll!UE::Cook::DumpObjClassList() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Cooker\CookProfiling.cpp:685]
PackagingResults: Error: [Callstack] 0x00007ffde0c3fafe UnrealEditor-UnrealEd.dll!UCookOnTheFlyServer::EvaluateGarbageCollectionResults() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\CookOnTheFlyServer.cpp:5010]
PackagingResults: Error: [Callstack] 0x00007ffde09c0eaf UnrealEditor-UnrealEd.dll!UCookCommandlet::ConditionalCollectGarbage() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:656]
PackagingResults: Error: [Callstack] 0x00007ffde09c5320 UnrealEditor-UnrealEd.dll!UCookCommandlet::CookByTheBook() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:503]
PackagingResults: Error: [Callstack] 0x00007ffde09e43b1 UnrealEditor-UnrealEd.dll!UCookCommandlet::Main() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\Commandlets\CookCommandlet.cpp:242]
PackagingResults: Error: [Callstack] 0x00007ff6a93dd0de UnrealEditor-Cmd.exe!FEngineLoop::PreInitPostStartupScreen() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:4127]
PackagingResults: Error: [Callstack] 0x00007ff6a93d454b UnrealEditor-Cmd.exe!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:140]
PackagingResults: Error: [Callstack] 0x00007ff6a93d482a UnrealEditor-Cmd.exe!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107]
PackagingResults: Error: [Callstack] 0x00007ff6a93d74f0 UnrealEditor-Cmd.exe!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244]
PackagingResults: Error: [Callstack] 0x00007ff6a93ea4c4 UnrealEditor-Cmd.exe!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:284]
PackagingResults: Error: [Callstack] 0x00007ff6a93ecb76 UnrealEditor-Cmd.exe!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
PackagingResults: Error: [Callstack] 0x00007fff9852e8d7 KERNEL32.DLL!UnknownFunction []
PackagingResults: Error: [Callstack] 0x00007fff991bbf2c ntdll.dll!UnknownFunction []
PackagingResults: Error: end: stack for UAT
UATHelper: Packaging (Windows): Took 77.86266529999999s to run UnrealEditor-Cmd.exe, ExitCode=3
UATHelper: Packaging (Windows): ERROR: Cook failed.
UATHelper: Packaging (Windows):        (see C:\Users\suitt\AppData\Roaming\Unreal Engine\AutomationTool\Logs\H+Epic+UE_5.2\Log.txt for full exception trace)
UATHelper: Packaging (Windows): AutomationTool executed for 0h 1m 22s
UATHelper: Packaging (Windows): AutomationTool exiting with ExitCode=25 (Error_UnknownCookFailure)
PackagingResults: Error: Cook failed.
UATHelper: Packaging (Windows): BUILD FAILED
PackagingResults: Error: Unknown Cook Failure
```

このログ以外にも、**GarbageCollection**で検索するとこのようなログを見つけました
```
LogConfig: Applying CVar settings from Section [/Script/Engine.GarbageCollectionSettings] File [Engine]
UATHelper: Packaging (Windows): LogCookCommandlet: Display: GarbageCollection... (Soft GC)
UATHelper: Packaging (Windows): LogCook: Display: GarbageCollection Results:
UATHelper: Packaging (Windows): LogCookCommandlet: Display: GarbageCollection... (Exceeded Max Memory)
UATHelper: Packaging (Windows): LogCook: Display: GarbageCollection Results: Garbage Collection was not very impactful.
```

どうやら、パッケージ化の最中に最大メモリを超えてしまったようです。

## 解決した方法
Chromeなど、メモリを多く使用するソフトを終了し、メモリの空きを確保

## 補足
### コマンドラインでの実行
メモリの空きを確保する方法で一番簡単なのはメモリを多く使用しているソフトを終了させることですが、UnrealEngineはバッチによるパッケージ化にも対応しているので、どうやってもメモリがカツカツな場合はUnrealEditorを閉じてバッチを使用するのも一つの手だと思います。
バッチビルドに関して詳しくは[こちら](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/build-operations-cooking-packaging-deploying-and-running-projects-in-unreal-engine#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3)をご覧ください
参考程度に、私が使用しているコマンドを載せます。
このコマンドはWindowsでの実行を想定しています。
また、Developmentパッケージを想定しています。

- {RunUAT_path}と書いてある部分にはRunUATバッチがあるパスに修正してください。
- {UnrealEditor-Cmd_path}と書いてある部分にはUnrealEditor-Cmd.exeがあるパスに修正してください。
- {uproject_path}と書いてある部分はご自身の.uprojectがあるパスに修正してください。
- {export_path}と書いてある部分はパッケージ化した成果物を出力したいパスに修正してください。
- {target_project}と書いてある部分はご自身のプロジェクト名に修正してください。
```
cmd.exe /c ""{RunUAT_path}"  -ScriptsForProject="{uproject_path}" Turnkey -command=VerifySdk -platform=Win64 -UpdateIfNeeded -EditorIO -EditorIOPort=58297  -project="{uproject_path}" BuildCookRun -nop4 -utf8output -nocompileeditor -skipbuildeditor -cook  -project="{uproject_path}" -target={target_project}  -unrealexe="{UnrealEditor-Cmd_path}" -platform=Win64 -installed -stage -archive -package -build -pak -iostore -compressed -prereqs -archivedirectory="{export_path}" -clientconfig=Development" -nocompile -nocompileuat
```
こちらのコマンドを.ps1拡張子のファイルに書き込み、PowerShellから実行するとパッケージ化が行えます。

### DefaultEngine.iniファイルでメモリの使用量を調節
[こちら](https://forums.unrealengine.com/t/i-have-a-major-problem-in-unreal-engine-5-1/749187/6)のフォーラムを見たところ、DefaultEditor.iniにて使用するメモリの最小量などを調節できるようです。
私の環境では確認できていませんが、この辺りの設定を変更すればメモリ不足によるパッケージ化失敗を防げるかもしれません。
フォーラムが削除された時のことを想定し、フォーラム内で言及されている設定項目を下記の載せます。
```
[CookSettings]
MemoryMinFreePhysical=1024
MemoryMinFreeVirtual=1024
MemoryMaxUsedPhysical=16384
```

## 最後に
パッケージ化の際にどれくらいメモリを使用するのかタスクマネージャーから見たところ、**Unreal Pac**というプロセスが25GBも使用していました。
それでも私のPCでは20%ほどメモリに空きがあったので問題ないとは思っていたのですが、パッケージ化に失敗してしまいました。
ネットでいくらググっても全然情報が出てこずものすごい詰まってしまったので、同じようなエラーでパッケージ化ができない方の一助になれば幸いです...。