RhinoFreak 发表于 2022-8-9 11:46

基于 VS Debug 的 UE4 打包问题调查方案

首发地址:

问题背景:为什么需要对 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>]
[*]参见:https://docs.unrealengine.com/5.0/zh-CN/cooking-content-in-unreal-engine/





点击确定或应用,属性页面会自动关闭。


开始调试


[*]点击 Debug - Start Debugging ,或直接按 F5 等,启动调试




通过对堆栈和属性等或其它操作进行正常的分析调试。






关于指令格式



[*]可以通过查阅官方文档等找到对应的指令

[*]如对于 Cook 的官方说明:https://docs.unrealengine.com/5.0/zh-CN/cooking-content-in-unreal-engine/

[*]也可通过分析相关日志来查找相关命令
[*]如打开 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.uprojectD:\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 -xgeexportD:\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 -xgeexportD:\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 -xgeexportD:\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 。
参考链接


[*]UE4小技巧(https://blog.csdn.net/u013917120/article/details/102580739)
[*]内容烘焙(https://docs.unrealengine.com/5.0/zh-CN/cooking-content-in-unreal-engine/)
声明:本文来自公众号:Unity 与Unreal 游戏开发(GameDevLearning),转载请附上原文链接及本声明。
页: [1]
查看完整版本: 基于 VS Debug 的 UE4 打包问题调查方案