Crash in Metal GPU profiler

Ever since updating our automated tests to use Unreal 5.6, we have started getting crashes when executing a Mac game with the attached callstack. I have also attached a full log from a crashing run.

Our tests crash randomly, so it is hard to give precise repro steps. We unfortunately have to use the Launcher version of the engine for our tests, and I failed to find a way of disabling GPU profiling as a workaround.

Is there anything we can do on our end to either fix or workaround the crash?

Hello, unfortunately this is one of our top crashes and it’s unclear yet what causes the problem. I don’t think you can disable the code that collects breadcrumbs for profiling without re-compiling the engine. You can try setting r.GPUCrashDebugging.Breadcrumbs=0 or running with -nogpucrashdebugging, but I don’t think that will disable the code that’s crashing here. For automated testing do you need to render at all? Can you use -nullrhi?

Hi,

I ran for a week with -nullrhi, and it seems to workaround the problem for now.

Thanks!

Got the same crash. However it happended in a packaged shipping iOS app. Still crashed in UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::FQueueState::BeginBreadcrumb

  • EngineVersion: 5.6.1 SourceCode
  • iOS Version: 26.2, 26.1

Here is the call stack

Thread 4 name: Foreground Worker #0
1
FeelingAI
UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::FQueueState::BeginBreadcrumb(UE::RHI::GPUProfiler::FEvent::FBeginBreadcrumb const&) (in FeelingAI:88)
2
FeelingAI
UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::FQueueState::BeginBreadcrumb(UE::RHI::GPUProfiler::FEvent::FBeginBreadcrumb const&) (in FeelingAI:60)
3
FeelingAI
UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::ProcessQueue(UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::FQueueState&, UE::RHI::GPUProfiler::FEventSink::FIterator&) (in FeelingAI:536)
4
FeelingAI
UE::RHI::GPUProfiler::FGPUProfilerSink_StatSystem::ProcessAllQueues() (in FeelingAI:688)
5
FeelingAI
UE::RHI::GPUProfiler::ProcessEvents(TArrayView<UE::RHI::GPUProfiler::FEventStream, int>) (in FeelingAI:576)
6
FeelingAI
UE::Core::Private::Function::TFunctionRefCaller<FMetalDynamicRHI::RHIEndFrame(FDynamicRHI::FRHIEndFrameArgs const&)::$_0, void, >::Call(void*) (in FeelingAI:380)
7
FeelingAI
TGraphTask<TFunctionGraphTaskImpl<void (), (ESubsequentsMode::Type)0> >::ExecuteTask() (in FeelingAI:572)
8
FeelingAI
UE::Tasks::Private::FTaskBase::TryExecuteTask() (in FeelingAI:244)
9
FeelingAI
LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask* (bool), (unsigned int)48>::TTaskDelegateImpl<LowLevelTasks::FTask(char16_t const*, LowLevelTasks::ETaskPriority, UE::Tasks::Private::FTaskBase::Init(char16_t const*, LowLevelTasks::ETaskPriority, UE::Tasks::EExtendedTaskPriority, UE::Tasks::ETaskFlags)::{lambda()#1}&&, LowLevelTasks::ETaskFlags)::Init<UE::Tasks::Private::FTaskBase::Init(char16_t const*, LowLevelTasks::ETaskPriority, UE::Tasks::EExtendedTaskPriority, UE::Tasks::ETaskFlags)::{lambda()#1}>::{lambda(bool)#1}, false>::CallAndMove(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask* (bool), (unsigned int)48>&, void*, unsigned int, bool) (in FeelingAI:40)
10
FeelingAI
LowLevelTasks::FScheduler::ExecuteTask(LowLevelTasks::FTask*) (in FeelingAI:300)
11
FeelingAI
LowLevelTasks::FScheduler::WorkerLoop(LowLevelTasks::Private::FWaitEvent*, LowLevelTasks::Private::TLocalQueueRegistry<(unsigned int)1024, (unsigned int)1024>::TLocalQueue*, unsigned int, bool) (in FeelingAI:1848)
12
FeelingAI
LowLevelTasks::FScheduler::WorkerMain(LowLevelTasks::Private::FWaitEvent*, LowLevelTasks::Private::TLocalQueueRegistry<(unsigned int)1024, (unsigned int)1024>::TLocalQueue*, unsigned int, bool) (in FeelingAI:180)
13
FeelingAI
FThreadImpl::Run() (in FeelingAI:56)
14
FeelingAI
FRunnableThreadPThread::Run() (in FeelingAI:152)
15
FeelingAI
FRunnableThreadPThread::_ThreadProc(void*) (in FeelingAI:76)
16
libsystem_pthread.dylib
__pthread_start (in libsystem_pthread.dylib)
17
libsystem_pthread.dylib
_thread_start (in libsystem_pthread.dylib)

Is there any way to solve the problem?