Community Q&A

Where Wwise users help each other out!

Audiokinetic's Community Q&A is the forum where Wwise users ask and answer questions within the Wwise community. If you would like to get an answer from Audiokinetic's Technical support team, make sure you use the Support Tickets page.

Crash in packaged unreal game on 2019.2.7, Asserting on AsyncLoadingThread.RecursionNotAllowed

0 votes

Hi,
We recently migrated our project from version 2018.1.4 to 2019.2.7 and started using the event based packaging.
We got it working in the editor and in stand alone, but we get a crash on startup in packaged builds, both shipping and development.

I could not find any info about the crashes here on the forum but found a bugfix from version 2019.2.2 that could be related to the callstack we're seeing in the development build:
WG-48745 Fixed: Crash in packaged game with "Assertion failed: AsyncLoadingThread.RecursionNotAllowed"

I have appended the callstack from the development build, the assert that triggers is stripped in shipping so there it crashes further along with another assert.

Any info related to this crash or the bugfix mentioned would be appreciated.

Development Build:
Assertion failed: AsyncLoadingThread.RecursionNotAllowed.Increment() == 1 [File:D:/ws/SB-lowprio/UE4/Engine/Source/Runtime/CoreUObject/Private/Serialization/AsyncLoading.cpp] [Line: 3959]

FactoryGame!AssertFailedImplV() [d:\ws\sb-lowprio\ue4\engine\source\runtime\core\private\misc\assertionmacros.cpp:100]
FactoryGame!FDebug::CheckVerifyFailedImpl() [d:\ws\sb-lowprio\ue4\engine\source\runtime\core\private\misc\assertionmacros.cpp:450]
FactoryGame!FAsyncLoadingThread::ProcessAsyncLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:3984]
FactoryGame!FAsyncLoadingThread::TickAsyncThread() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:4820]
FactoryGame!FAsyncLoadingThread::TickAsyncLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:4519]
FactoryGame!FAsyncLoadingThread::FlushLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:6979]
FactoryGame!LoadPackageInternal() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1111]
FactoryGame!LoadPackage() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1427]
FactoryGame!ResolveName() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:767]
FactoryGame!StaticLoadObjectInternal() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:829]
FactoryGame!StaticLoadObject() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:904]
FactoryGame!FStreamableManager::StreamInternal() [d:\ws\sb-lowprio\ue4\engine\source\runtime\engine\private\streamablemanager.cpp:1105]
FactoryGame!FStreamableManager::StartHandleRequests() [d:\ws\sb-lowprio\ue4\engine\source\runtime\engine\private\streamablemanager.cpp:1297]
FactoryGame!FStreamableManager::RequestAsyncLoad() [d:\ws\sb-lowprio\ue4\engine\source\runtime\engine\private\streamablemanager.cpp:1242]
FactoryGame!FStreamableManager::RequestAsyncLoad() [d:\ws\sb-lowprio\ue4\engine\source\runtime\engine\private\streamablemanager.cpp:1252]
FactoryGame!UAkAssetDataWithMedia::Load() [d:\ws\sb-lowprio\ue4\engine\plugins\wwise\source\akaudio\private\akassetbase.cpp:83]
FactoryGame!UAkAssetDataSwitchContainer::Load() [d:\ws\sb-lowprio\ue4\engine\plugins\wwise\source\akaudio\private\akaudioevent.cpp:76]
FactoryGame!AkEventBasedIntegrationBehavior::AkAudioEvent_Load() [d:\ws\sb-lowprio\ue4\engine\plugins\wwise\source\akaudio\private\integrationbehavior\akeventbasedintegrationbehavior.cpp:292]
FactoryGame!UObject::ConditionalPostLoad() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\obj.cpp:1071]
FactoryGame!FAsyncPackage::PostLoadObjects() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:6357]
FactoryGame!FAsyncPackage::TickAsyncPackage() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:5533]
FactoryGame!FAsyncLoadingThread::ProcessAsyncLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:4064]
FactoryGame!FAsyncLoadingThread::TickAsyncThread() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:4820]
FactoryGame!FAsyncLoadingThread::TickAsyncLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:4519]
FactoryGame!FAsyncLoadingThread::FlushLoading() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\serialization\asyncloading.cpp:6979]
FactoryGame!LoadPackageInternal() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1111]
FactoryGame!LoadPackage() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:1427]
FactoryGame!ResolveName() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:767]
FactoryGame!StaticLoadObjectInternal() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:829]
FactoryGame!StaticLoadObject() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:904]
FactoryGame!StaticLoadClass() [d:\ws\sb-lowprio\ue4\engine\source\runtime\coreuobject\private\uobject\uobjectglobals.cpp:937]
FactoryGame!UFGGlobalSettings::Initialize() [d:\ws\sb-lowprio\ue4\games\factorygame\source\factorygame\private\fgglobalsettings.cpp:46]
FactoryGame!FFactoryGameModule::StartupModule() [d:\ws\sb-lowprio\ue4\games\factorygame\source\factorygame\private\factorygamemodule.cpp:22]
FactoryGame!FModuleManager::LoadModuleWithFailureReason() [d:\ws\sb-lowprio\ue4\engine\source\runtime\core\private\modules\modulemanager.cpp:423]
FactoryGame!FModuleDescriptor::LoadModulesForPhase() [d:\ws\sb-lowprio\ue4\engine\source\runtime\projects\private\moduledescriptor.cpp:561]
FactoryGame!FProjectManager::LoadModulesForProject() [d:\ws\sb-lowprio\ue4\engine\source\runtime\projects\private\projectmanager.cpp:63]
FactoryGame!FEngineLoop::LoadStartupModules() [d:\ws\sb-lowprio\ue4\engine\source\runtime\launch\private\launchengineloop.cpp:3910]
FactoryGame!FEngineLoop::PreInitPostStartupScreen() [d:\ws\sb-lowprio\ue4\engine\source\runtime\launch\private\launchengineloop.cpp:3272]
FactoryGame!GuardedMain() [d:\ws\sb-lowprio\ue4\engine\source\runtime\launch\private\launch.cpp:127]
FactoryGame!GuardedMainWrapper() [d:\ws\sb-lowprio\ue4\engine\source\runtime\launch\private\windows\launchwindows.cpp:137]
FactoryGame!WinMain() [d:\ws\sb-lowprio\ue4\engine\source\runtime\launch\private\windows\launchwindows.cpp:268]
FactoryGame!__scrt_common_main_seh() [d:\agent\_work\2\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll

asked Dec 8, 2020 in General Discussion by Gustav L. (150 points)

1 Answer

0 votes
Hi again, a followup on the issue, we have found what causes it and found a fix for it in our game.

The issue:
It was caused by a TryLoadClass we called in our game StartupModule, the class was a custom global settings class that contained some references to audio events.

The solution:
We moved this settings class to be loaded when first accessed instead of StartupModule, this postponed the call to TryLoadClass enough for it to not happen during the game module's startup.

Although we found a solution in our case we're still not sure if this is the expected behavior or if it is a bug that events cannot be loaded during the game module's startup call?
But If anyone else runs into this issue I hope this provides enough information for you to find a solution for your case.
answered Dec 11, 2020 by Gustav L. (150 points)
...