Hi Martin!
Thanks for the tips, I went ahead with the MTAccessDetector in the end since I already had a suspicion on the location of the access.
I temporarily added a new AccessDetector in UObject and took a write access scope in UPrimitiveComponent::ResetCustomPrimitiveData for this,
I also added a read scope in FObjectInitializer::InitProperties on DefaultData since later in the FProperty copy loop it will copy over CustomPrimitiveDataInternal from DefaultData.
I then managed to get this between the GT and ALT for a normal static mesh component with some CustomPrimitiveData:
GT:
Game.exe!FDebug::CheckVerifyFailedImpl2V(const char * Expr=0x00007ff76084e670, const char * File=0x00007ff7607bba50, int Line=0x00000072, const wchar_t * Format=0x00007ff76084e750, char * Args=0x000000da1377bd10)
Game.exe!FDebug::CheckVerifyFailedImpl2(const char * Expr, const char * File, int Line, const wchar_t * Format=0x00007ff76084e750, ...)
[Inline Frame] Game.exe!FRWAccessDetector::AcquireWriteAccess()
[Inline Frame] Game.exe!TScopedWriterDetector<FRWAccessDetector>::{ctor}(FRWAccessDetector &)
[Inline Frame] Game.exe!MakeScopedWriterAccessDetector(FRWAccessDetector &)
Game.exe!UPrimitiveComponent::ResetCustomPrimitiveData()
Game.exe!UPrimitiveComponent::PostLoad()
Game.exe!UStaticMeshComponent::PostLoad()
Game.exe!UObject::ConditionalPostLoad()
[Inline Frame] Game.exe!FAsyncLoadingTickScope2::{ctor}(FAsyncLoadingThread2 & InAsyncLoadingThread)
Game.exe!FAsyncPackage2::Event_DeferredPostLoadExportBundle(FAsyncLoadingThreadState2 & ThreadState={...}, FAsyncPackage2 * Package=0x00000204d2526fa0, int InExportBundleIndex)
Game.exe!FEventLoadNode2::Execute(FAsyncLoadingThreadState2 & ThreadState={...})
[Inline Frame] Game.exe!TGuardValue<enum EInternalObjectFlags,enum EInternalObjectFlags>::{dtor}()
Game.exe!FAsyncLoadEventQueue2::PopAndExecute(FAsyncLoadingThreadState2 & ThreadState={...})
Game.exe!FAsyncLoadingThread2::ProcessLoadedPackagesFromGameThread(FAsyncLoadingThreadState2 & ThreadState={...}, bool & bDidSomething=true, TArrayView<int const ,int> FlushRequestIDs={...})
Game.exe!FAsyncLoadingThread2::TickAsyncLoadingFromGameThread(FAsyncLoadingThreadState2 & ThreadState={...}, bool bUseTimeLimit=true, bool bUseFullTimeLimit=false, double TimeLimit=0.0050000003539025784, TArrayView<int const ,int> FlushRequestIDs={...}, bool & bDidSomething=true)
Game.exe!FAsyncLoadingThread2::ProcessLoadingFromGameThread(FAsyncLoadingThreadState2 & ThreadState={...}, bool bUseTimeLimit=true, bool bUseFullTimeLimit=false, double TimeLimit=0.0050000003539025784)
Game.exe!FAsyncLoadingThread2::ProcessLoading(bool bUseTimeLimit=true, bool bUseFullTimeLimit=false, double TimeLimit)
Game.exe!ProcessAsyncLoading(bool bUseTimeLimit=true, bool bUseFullTimeLimit=false, double TimeLimit)
Game.exe!StaticTick(float DeltaTime=0.00000000, bool bUseFullTimeLimit=false, float AsyncLoadingTime)
Game.exe!UGameEngine::Tick(float DeltaSeconds, bool bIdleMode=false)
Game.exe!FEngineLoop::Tick()
[Inline Frame] Game.exe!EngineTick()
Game.exe!GuardedMain(const wchar_t * CmdLine=0x00000201bb312c80)
Game.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance=0x000000000000000a, HINSTANCE__ * hPrevInstance=0x0000000000000000, char * __formal=0x0000000000000000, int nCmdShow=0x0ada70b0, const wchar_t * CmdLine=0x00000201bb312c80)
Game.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow)
[Inline Frame] Game.exe!invoke_main()
Game.exe!__scrt_common_main_seh()
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
ALT:
[Inline Frame] Game.exe!FRWAccessDetector::ReleaseReadAccess()
[Inline Frame] Game.exe!FObjectInitializer::InitProperties::__l2::<lambda_1>::operator()()
[Inline Frame] Game.exe!ScopeExitSupport::TScopeGuard<`FObjectInitializer::InitProperties'::`2'::<lambda_1>>::{dtor}()
Game.exe!FObjectInitializer::InitProperties(UObject * Obj=0x000002053d1e6280, UClass * DefaultsClass=0x00007ff48f88c8a8, UObject * DefaultData=0x00000204a00d41b0, bool bCopyTransientsFromClassDefaults=0x73)
Game.exe!FObjectInitializer::PostConstructInit()
Game.exe!FObjectInitializer::~FObjectInitializer()
Game.exe!StaticConstructObject_Internal(const FStaticConstructObjectParameters & Params)
Game.exe!FAsyncPackage2::EventDrivenCreateExport(const FAsyncPackageHeaderData & Header, int LocalExportIndex)
Game.exe!FAsyncPackage2::Event_ProcessExportBundle(FAsyncLoadingThreadState2 & ThreadState={...}, FAsyncPackage2 * Package=0x00000205480d6280, int InExportBundleIndex=0x00000000)
Game.exe!FEventLoadNode2::Execute(FAsyncLoadingThreadState2 & ThreadState={...})
[Inline Frame] Game.exe!TGuardValue<enum EInternalObjectFlags,enum EInternalObjectFlags>::{dtor}()
Game.exe!FAsyncLoadEventQueue2::PopAndExecute(FAsyncLoadingThreadState2 & ThreadState={...})
Game.exe!FAsyncLoadingThread2::Run()
Game.exe!FRunnableThreadWin::Run()
Game.exe!FRunnableThreadWin::GuardedRun()
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
This seems to indicate that there could be an issue for any PrimitiveComponent if the template object is being loaded at the same time and has some CustomPrimitiveData.
Best,
Robin
[Attachment Removed]