问题背景:为什么需要对 Cook 做 Debug
工程打包出错时,很多情况下都是因为 Cook 出现了问题,而 Cook 失败的日志提示可能不够详细。此时可能经常会想:如果可以对出错的地方进行断点调试就好了。
本文要解决的问题就是:如何对 Cook 进行 Debug ,以便获取更详细的信息等上下文来帮我们解决这个过程中出现的崩溃、错误或其它问题。
本文基于 VS ( Visual Studio 2019 ) 来对 UE4 的 Cook 过程进行 Debug , 原则上其它可以跑 UE 的 IDE (如 Rider 等)也可以执行类似操作。
怎么做:Cook Debug 流程
打开项目的 VS 工程
以对应的 Visual Studio(以下简称 VS ) 打开工程下的 sln 文件以通过 VS 打开工程。\
也可以通过其它方式如从 UE 编辑器中打开 VS 工程。
在需要的地方下断点
比如在打包日志中发现如下日志:
ProcessResult.StdOut: LogSkeletalMesh: Warning: FSkeletalMeshModel /Game/XXX/XXX/XXX/SK_XXX.SK_XXX Loading GUID 276238181 1225814315 1057386166 -1724108179
如果我们想获取更多信息的话,可以在 UE 源代码中找到对应的代码,下断点。
当然你也可以在任何你想要调试的地方下断点,需要注意相关代码是否被优化掉了。
选择合适的 VS 配置
选择合适的配置(Solution Configuration)、平台(Solution Platforms)和启动工程(Startup Projects,一般为要调试的目标工程)等
打开工程的属性配置界面
在解决方案视图(Solution Explorer)中的工程名字上右键,点击属性(Properties)。
此时会打开对应工程的属性页面(Property Pages)
点击配置属性(Configuration Properties) 下的调试(Debugging) 标签
在命令参数(Command Arguments)中输入对应的 Cook 命令
Cook 命令格式
-run=cook -targetplatform=<Plat1>+<Plat2> [-cookonthefly] [-iterate] [-map=<Map1>+<Map2>]
- 参见:内容烘焙
点击确定或应用,属性页面会自动关闭。
开始调试
点击 Debug - Start Debugging ,或直接按 F5 等,启动调试
通过对堆栈和属性等或其它操作进行正常的分析调试。
关于指令格式
可以通过查阅官方文档等找到对应的指令
- 如对于 Cook 的官方说明:内容烘焙
也可通过分析相关日志来查找相关命令
如打开 AutomationTool 的日志(Engine\Programs\AutomationTool\Saved\Logs\Log.txt),搜索
CommandUtils.Run: Running,可以看到很多 Command 命令调用
+ 228 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe UnrealHeaderTool Win64 Development -Project=D:\project_no\project_name\ProjectName.uproject D:\project_no\project_name\ProjectName.uproject -NoUBTMakefiles -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -NoHotReload -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-UnrealHeaderTool-Win64-Development.txt"
+ 296 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe UnrealHeaderTool Win64 Development -NoUBTMakefiles -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -NoHotReload -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-UnrealHeaderTool-Win64-Development_2.txt"
+ 366 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe ProjectNameEditor Win64 Development -Project=D:\project_no\project_name\ProjectName.uproject -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -nobuilduht -NoHotReload -xgeexport D:\project_no\project_name\ProjectName.uproject -NoUBTMakefiles -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-ProjectNameEditor-Win64-Development.txt"
+ 407 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe ShaderCompileWorker Win64 Development -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -nobuilduht -NoHotReload -xgeexport -NoUBTMakefiles -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-ShaderCompileWorker-Win64-Development.txt"
+ 430 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe UnrealPak Win64 Development -Project=D:\project_no\project_name\ProjectName.uproject -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -nobuilduht -NoHotReload -xgeexport D:\project_no\project_name\ProjectName.uproject -NoUBTMakefiles -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-UnrealPak-Win64-Development.txt"
+ 450 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe ProjectName PS4 Debug -Project=D:\project_no\project_name\ProjectName.uproject -Manifest=I:\UE\UE_4.26.2\Engine\Intermediate\Build\Manifest.xml -nobuilduht -NoHotReload -xgeexport D:\project_no\project_name\ProjectName.uproject -NoUBTMakefiles -remoteini="D:\project_no\project_name" -skipdeploy -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-ProjectName-PS4-Debug.txt"
+ 501 CommandUtils.Run: Running: C:\Program Files (x86)\IncrediBuild\xgConsole.exe "I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UAT_XGE.xml" /Rebuild /NoLogo /ShowAgent /ShowTime /no_watchdog_thread
+ 5193 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\DotNET\UnrealBuildTool.exe -Mode=Deploy -Receipt="D:\project_no\project_name\Binaries\PS4\ProjectName-PS4-Debug.target" -log="I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Logs\UBT-.txt"
+ 10148 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\Win64\UE4Editor-Cmd.exe D:\project_no\project_name\ProjectName.uproject -run=Cook -TargetPlatform=PS4 -fileopenlog -unversioned -abslog=I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Cook-2022.05.30-16.58.48.txt -stdout -CrashForUAT -unattended -NoLogTimes -UTF8Output
- 其中就有 Cook 命令的详细调用语句。
+ 10148 CommandUtils.Run: Running: I:\UE\UE_4.26.2\Engine\Binaries\Win64\UE4Editor-Cmd.exe D:\project_no\project_name\ProjectName.uproject -run=Cook -TargetPlatform=PS4 -fileopenlog -unversioned -abslog=I:\UE\UE_4.26.2\Engine\Programs\AutomationTool\Saved\Cook-2022.05.30-16.58.48.txt -stdout -CrashForUAT -unattended -NoLogTimes -UTF8Output
- 可通过类似的方法对其它 Command 进行 Debug 。