FNiagaraParameterStore::UnbindAll() may be called from both GameThread and RenderingThread.
Each may modify the same Binding array, it causes infrequent crashes.
In my environment, I was able to reproduce the crash with a fairly high probability by using the log output code described in the repro step.
Placing a CriticalSection at UnbindAll work around this issue.
FCriticalSection GNiaagraParameterStoreUnbindingCS; // workaround void FNiagaraParameterStore::UnbindAll() { FScopeLock Lock(&GNiaagraParameterStoreUnbindingCS); // workaround UnbindFromSourceStores(); for (TPair<FNiagaraParameterStore*, FNiagaraParameterStoreBinding>& Binding : Bindings) { Binding.Value.Empty(Binding.Key, this); } Bindings.Empty(); }
1. Add the logging code to the FNiagaraParameterStoreBinding
FORCEINLINE_DEBUGGABLE void FNiagaraParameterStoreBinding::Empty(FNiagaraParameterStore* DestStore, FNiagaraParameterStore* SrcStore) { if (DestStore) { //UE_LOG(LogNiagara, Log, TEXT("Remove Src Binding: Src: 0x%p - Dst: 0x%p"), SrcStore, DestStore); UE_LOG( LogTemp, Log, TEXT("Binding:Empty %p Src: %p : %s"), DestStore, SrcStore, IsInRenderingThread()?TEXT("Render"):TEXT("Game") ); //add this DestStore->GetSourceParameterStores().RemoveSingleSwap(SrcStore, false); } DestStore = nullptr; ParameterBindings.Reset(); InterfaceBindings.Reset(); UObjectBindings.Reset(); }
2. Open attached project on 4.26 [Link Removed]
3. Start PIE
> [Inline Frame] UE4Editor-Niagara.dll!TArray<FNiagaraParameterStore *,TSizedDefaultAllocator<32>>::RangeCheck(int Index) Line 674 C++ [Inline Frame] UE4Editor-Niagara.dll!TArray<FNiagaraParameterStore *,TSizedDefaultAllocator<32>>::operator[](int) Line 718 C++ UE4Editor-Niagara.dll!FNiagaraParameterStore::UnbindFromSourceStores() Line 463 C++ UE4Editor-Niagara.dll!FNiagaraParameterStore::UnbindAll() Line 359 C++ UE4Editor-Niagara.dll!FNiagaraParameterStore::~FNiagaraParameterStore() Line 196 C++ UE4Editor-Niagara.dll!FNiagaraEmitterInstance::~FNiagaraEmitterInstance() Line 182 C++ [Inline Frame] UE4Editor-Niagara.dll!SharedPointerInternals::FReferenceControllerOps<1>::ReleaseSharedReference(SharedPointerInternals::FReferenceControllerBase * ReferenceController) Line 282 C++ [Inline Frame] UE4Editor-Niagara.dll!SharedPointerInternals::FSharedReferencer<1>::{dtor}() Line 469 C++ [Inline Frame] UE4Editor-Niagara.dll!DestructItems(TSharedRef<FNiagaraEmitterInstance,1> * Element, int Count) Line 158 C++ UE4Editor-Niagara.dll!TArray<TSharedRef<FNiagaraEmitterInstance,1>,TSizedDefaultAllocator<32>>::Empty(int Slack) Line 1723 C++ UE4Editor-Niagara.dll!FNiagaraSystemInstance::Cleanup() Line 1168 C++ UE4Editor-Niagara.dll!FNiagaraSystemInstance::~FNiagaraSystemInstance() Line 1140 C++ UE4Editor-Niagara.dll!FNiagaraSystemInstance::`vector deleting destructor'(unsigned int) C++ [Inline Frame] UE4Editor-Niagara.dll!TDefaultDelete<FNiagaraSystemInstance>::operator()(FNiagaraSystemInstance * Ptr) Line 64 C++ [Inline Frame] UE4Editor-Niagara.dll!TUniquePtr<FNiagaraSystemInstance,TDefaultDelete<FNiagaraSystemInstance>>::{dtor}() Line 266 C++ [Inline Frame] UE4Editor-Niagara.dll!DestructItems(TUniquePtr<FNiagaraSystemInstance,TDefaultDelete<FNiagaraSystemInstance>> * Element, int Count) Line 158 C++ UE4Editor-Niagara.dll!TArray<TUniquePtr<FNiagaraSystemInstance,TDefaultDelete<FNiagaraSystemInstance>>,TSizedDefaultAllocator<32>>::Empty(int Slack) Line 1723 C++ [Inline Frame] UE4Editor-Niagara.dll!FNiagaraWorldManager::OnBatcherDestroyed_Internal(NiagaraEmitterInstanceBatcher *) Line 391 C++ UE4Editor-Niagara.dll!FNiagaraWorldManager::OnBatcherDestroyed(NiagaraEmitterInstanceBatcher * InBatcher) Line 505 C++ UE4Editor-Niagara.dll!NiagaraEmitterInstanceBatcher::OnDestroy() Line 1531 C++ UE4Editor-Engine.dll!FFXSystemSet::OnDestroy() Line 206 C++ UE4Editor-Engine.dll!FFXSystemInterface::Destroy(FFXSystemInterface * FXSystem) Line 69 C++ UE4Editor-Engine.dll!UWorld::CleanupWorldInternal(bool bSessionEnded, bool bCleanupResources, UWorld * NewWorld) Line 4541 C++ UE4Editor-Engine.dll!UEngine::LoadMap(FWorldContext & WorldContext, FURL URL, UPendingNetGame * Pending, FString & Error) Line 12764 C++ UE4Editor-Engine.dll!UEngine::Browse(FWorldContext & WorldContext, FURL URL, FString & Error) Line 12338 C++ UE4Editor-Engine.dll!UEngine::TickWorldTravel(FWorldContext & Context, float DeltaSeconds) Line 12536 C++ UE4Editor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 1692 C++ UE4Editor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) Line 426 C++ UE4Editor.exe!FEngineLoop::Tick() Line 4836 C++ [Inline Frame] UE4Editor.exe!EngineTick() Line 62 C++ UE4Editor.exe!GuardedMain(const wchar_t * CmdLine) Line 169 C++ UE4Editor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 257 C++
!TArray<TTuple<FNiagaraParameterStore * __ptr64,FNiagaraParameterStoreBinding>,TSizedDefaultAllocator<32> >::RemoveAtSwapImpl() !FNiagaraParameterStore::UnbindFromSourceStores() !FNiagaraParameterStore::UnbindAll() !FNiagaraParameterStore::~FNiagaraParameterStore() !FNiagaraEmitterInstance::~FNiagaraEmitterInstance() !TArray<TSharedRef<FNiagaraEmitterInstance,1>,TSizedDefaultAllocator<32> >::Empty() !FNiagaraSystemInstance::Cleanup() !FNiagaraSystemInstance::~FNiagaraSystemInstance() !FNiagaraSystemInstance::`vector deleting destructor'() !FNiagaraWorldManager::OnWorldCleanup() !FNiagaraWorldManager::OnWorldCleanup() !TBaseStaticDelegateInstance<void __cdecl(UWorld * __ptr64,bool,bool),FDefaultDelegateUserPolicy>::ExecuteIfSafe() !TMulticastDelegate<void __cdecl(UWorld * __ptr64,bool,bool),FDefaultDelegateUserPolicy>::Broadcast() !UWorld::CleanupWorldInternal() !FSeamlessTravelHandler::Tick() !UEngine::TickWorldTravel() !UGameEngine::Tick() !FEngineLoop::Tick() !GuardedMain() !GuardedMainWrapper() !WinMain() !__scrt_common_main_seh() [d:\agent\_work\2\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] kernel32 ntdll
How does TextureRenderTarget2D get TArray<uint8> type data?
Why does the REMOVE method of map container remove elements have memory leaks?
How do I set a material as a post-processing material?
What is the cause of the packaging error falling back to 'GameUserSettings' in ue5?
How to delete some elements correctly when deleting an array loop?
What is the difference between Camera and CineCamera?
How to implement springarm components to scale according to mouse position in spawn?
What controls of umg have mouse wheel events in UE4.27?
How to assign a value to a member of UMG's UMaterialInterface pointer type in C++?
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-140253 in the post.
0 |
Component | UE - Niagara |
---|---|
Affects Versions | 4.26.2 |
Target Fix | 5.0 |
Created | Jan 26, 2022 |
---|---|
Resolved | Jan 29, 2022 |
Updated | Jan 25, 2023 |