一、引言
最近打算尝试一下UE5.5的C++开发,结果一上来就给我踩了一个坑。不管是直接创建C++项目还是用蓝图项目转C++,都会编译失败。以下为主要报错信息:
Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Repeat 2 times:
--------------------------------
at EpicGames.UBA.SessionServerImpl.SessionServer_RunProcess(IntPtr, IntPtr, Boolean, Boolean)
--------------------------------
at EpicGames.UBA.SessionServerImpl.RunProcess(EpicGames.UBA.ProcessStartInfo, Boolean, ExitedEventHandler, Boolean)
at UnrealBuildTool.UBAExecutor+<>c__DisplayClass62_0.<RunActionLocal>b__0()
at UnrealBuildTool.ImmediateActionQueue+<>c__DisplayClass60_0.<TryStartOneAction>b__0()
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread)
11>Microsoft.MakeFile.Targets(44,5): Error MSB3073 : 命令“E:\UnrealEngine\UE_5.5\Engine\Build\BatchFiles\Build.bat SteamGameEditor Win64 Development -Project="E:\UnrealProject\SteamGame\SteamGame.uproject" -WaitMutex -FromMsBuild -architecture=x64”已退出,代码为 -1073741819。
一开始看到错误代码MSB3073,按着这个报错找了很多篇文章,其中包括:检查中文路径、删除缓存文件并重新生成项目、更新ViusualStudio组件,但都没什么用。
直到注意到了System.AccessViolationException,以及报错中提到的 UBA(UbaSessionServer) 才顺藤摸瓜地从官方社区里找到了一篇外国老哥的文章。
顺便去搜了一些相关资料,才发现UBA确实会引发内存访问冲突或编译错误,可以通过禁用UBA的远程执行器和本地执行器来绕过这些问题,禁用后,编译过程将回退到传统的本地编译方式,从而避免 UBA 可能引入的复杂性。
二、解决方法
简单来说,你需要打开 C:\Users[你的用户名]\AppData\Roaming\Unreal Engine\UnrealBuildTool 下的 BuildConfiguration.xml 文件。
然后在中添加以下片段
<bAllowUBAExecutor>false</bAllowUBAExecutor>
<bAllowUBALocalExecutor>false</bAllowUBALocalExecutor>
添加完后的内容是这样的
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
<BuildConfiguration>
<bAllowUBAExecutor>false</bAllowUBAExecutor>
<bAllowUBALocalExecutor>false</bAllowUBALocalExecutor>
</BuildConfiguration>
</Configuration>
然后就能成功编译了。
三、注意事项
-
禁用 UBA 执行器可能会导致编译速度变慢,因为 UBA 通常用于加速编译过程。
-
编译问题解决后,可以根据需要重新启用这些执行器以恢复加速功能