報錯信息如下
UnrealBuildTool failed. See log for more details. (/Users/somebody/Library/Logs/Unreal Engine/LocalBuildLogs/UBA-UnrealDemo-IOS-Shipping_2.txt)
AutomationException: UnrealBuildTool failed. See log for more details. (/Users/somebody/Library/Logs/Unreal Engine/LocalBuildLogs/UBA-UnrealDemo-IOS-Shipping_2.txt)at AutomationTool.CommandUtils.RunUBT(CommandEnvironment Env, FileReference UnrealBuildToolDll, String CommandLine) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/UBTUtils.cs:line 59at AutomationTool.UnrealBuild.BuildWithUBT(List`1 Targets, Dictionary`2 TargetToManifest, Boolean DisableXGE, Boolean AllCores, Boolean SkipBuild) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/UnrealBuild.cs:line 190at AutomationTool.UnrealBuild.Build(BuildAgenda InAgenda, Nullable`1 InDeleteBuildProducts, Boolean InUpdateVersionFiles, Boolean InForceNoXGE, Boolean InAllCores, Nullable`1 InChangelistNumberOverride, Dictionary`2 InTargetToManifest, Boolean InSkipBuild) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/UnrealBuild.cs:line 600at AutomationScripts.Project.Build(BuildCommand Command, ProjectParams Params, Int32 WorkingCL, ProjectBuildTargets TargetMask) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/Scripts/BuildProjectCommand.Automation.cs:line 232at BuildCookRun.DoBuildCookRun(ProjectParams Params) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/Scripts/BuildCookRun.Automation.cs:line 252at BuildCookRun.ExecuteBuild() in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/Scripts/BuildCookRun.Automation.cs:line 43at AutomationTool.BuildCommand.Execute() in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/BuildCommand.cs:line 372at AutomationTool.BuildCommand.ExecuteAsync() in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/BuildCommand.cs:line 381at AutomationTool.Automation.ExecuteAsync(List`1 CommandsToExecute, Dictionary`2 Commands) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/Automation.cs:line 284at AutomationTool.Automation.ExecuteAsync(List`1 CommandsToExecute, Dictionary`2 Commands) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/Automation.cs:line 308at AutomationTool.Automation.ProcessAsync(ParsedCommandLine AutomationToolCommandLine, StartupTraceListener StartupListener, HashSet`1 ScriptModuleAssemblies) in /Users/build/Build/++UE5/Sync/Engine/Saved/CsTools/Engine/Source/Programs/AutomationTool/AutomationUtils/Automation.cs:line 168
AutomationTool executed for 0h 3m 34s
AutomationTool exiting with ExitCode=139 (139)
去查看 UBA-UnrealDemo-IOS-Shipping_2.txt 這個文件呢,則沒有發現有效的報錯信息。
可以看到在編譯途中就終止了,“戛然而止”,表現如下:
[194/204] Compile [arm64] UnrealDemo1.cpp
[195/204] Compile [arm64] UnrealDemo2.cpp
[196/204] Compile [arm64] UnrealDemo3.cpp
[197/204] Compile [arm64] UnrealDemo4.cpp
[198/204] Compile [arm64] UnrealDemo5.cpp
[199/204] Compile [arm64] UnrealDemo6.cpp
排查過程
- UBA-UnrealDemo-IOS-Shipping_2.txt 這個文件沒有報錯信息,不代表就沒有問題,反而說明了另外一個問題:編譯器沒有正確拋異常。
- 回到最開始的報錯信息,這里有一個錯誤碼是有效的信息:AutomationTool exiting with ExitCode=139 (139)。直接讓ai給我們分析一下這個錯誤碼是什么意思。
AI回復如下
虛幻引擎構建 IPA 時出現 AutomationTool exiting with ExitCode=139 (139) 錯誤通常表示??進程因內存訪問沖突(段錯誤)被操作系統強制終止??。此錯誤在 macOS/Linux 系統中常見(對應 SIGSEGV 信號),可能由資源不足、文件損壞或環境問題引發。
AI還給出了一些解決方案,比如檢查機器內存跟硬盤條件等,這里感覺不太像,因為我的機器配置還行,運行時的狀態也還不錯。雖然解決方案無用,但是很好的印證了我們上述的猜想:編譯器沒有正確拋出異常,應該是UBT直接掛掉了,導致編譯到一半就停了,產生了這樣的現象。
3. 看以往UE版本的構建日志,從UE5.4開始,UBA-UnrealDemo-IOS-Shipping_2.txt 這個文件前綴加上了UBA。這個其實是有點疑問的,但是還沒有去理它。
4. 我根據錯誤碼信息來搜,已經快速得到了一個直接有用的經驗:https://community.cesium.com/t/issue-problems-with-cesium-and-ue-5-5-3-on-macos-ios/38984/2
5. 再來查下UBA的相關信息,一下子就有了很多內容了。虛幻論壇很多都有反饋UBA導致的編譯報錯或崩潰問題。虛幻文檔自己也寫著,UBA only supports Windows in Unreal Engine 5.5. Support for Mac and Linux are planned for a future release.
:https://dev.epicgames.com/documentation/en-us/unreal-engine/horde-unreal-build-accelerator-and-remote-compilation-tutorial-for-unreal-engine
結合上述的信息,關閉UBA應該是有效的,至少關閉UBA不至于引入什么額外的壞影響。那就大膽嘗試,驗證關閉UBA后可以正常構建iOS了。
解決方案
關閉UBA,以下兩選一都可以。
- 根據虛幻官方的文檔,通過配置文件來實現: https://dev.epicgames.com/documentation/zh-cn/unreal-engine/build-configuration-for-unreal-engine
- 自己改虛幻引擎中UBA的默認配置,重編UBT即可,文件為: Engine/Source/Programs/UnrealBuildTool/Configuration/BuildConfiguration.cs
真正的原因
我還真不知道…留個坑,要是以后知道了就回來寫。
個人猜測耗時開啟UBA分布式編譯之后,UBA與Xcode之間的兼容性沖突是高度可能的原因。
- UBA在UE5.5中仍屬于??Beta功能??,且官方文檔明確其??對macOS/Linux的支持尚未完善
- UE5.5官方release notes寫的是推薦用Xcode 15.4+??,我們的機器上用的16.2,可能UBA不兼容,導致UBT崩潰。因為這個情況在多臺電腦上都遇到,所以不是偶然的問題。
其他參考資料
https://forums.unrealengine.com/t/compiler-crashes-while-compiling-engine/2546500/4
https://forums.unrealengine.com/t/solution-for-ue-5-5-1-new-c-project-compilation-issues-attempted-to-read-or-write-protected-memory/2298265