Strange segfault in object property lookup after upgrade to 5.2

I recently upgraded to 5.2 and found the following segfault crash suddenly occurring when my monster character hits my player character:

Caught signal

FPackageBuildDependencyTracker::StaticOnObjectHandleRead(TArrayView<UObject const* const, int>) Address = 0x10fc8aca8 (filename not found) [in UnrealEditor-UnrealEd.dylib]
UE::CoreUObject::Private::ObjectHandleCallbacks::OnHandleRead(TArrayView<UObject const* const, int>) Address = 0x1028a587c (filename not found) [in UnrealEditor-CoreUObject.dylib]
FObjectProperty::GetObjectPropertyValue(void const*) const Address = 0x102910cdc (filename not found) [in UnrealEditor-CoreUObject.dylib]
void FObjectPropertyBase::GetWrappedUObjectPtrValues_InContainer<UE::Core::Private::FWrappedObjectPtr>(UObject**, void const*, int, int) const Address = 0x102910e70 (filename not found) [in UnrealEditor-CoreUObject.dylib]
FFrame::StepExplicitProperty(void*, FProperty*) Address = 0x10297e678 (filename not found) [in UnrealEditor-CoreUObject.dylib]
ARyddelmystCharacter::execHandleDamage(UObject*, FFrame&, void*) Address = 0x3049d38b8 [/Users/jeffrey.creswell/gamedev/ryddelmyst/Ryddelmyst_5.2/Intermediate/Build/Mac/UnrealEditor/Inc/Ryddelmyst/UHT/RyddelmystCharacter.gen.cpp, line 158] [in UnrealEditor-Ryddelmyst.dylib]
UFunction::Invoke(UObject*, FFrame&, void*) Address = 0x1026abde4 (filename not found) [in UnrealEditor-CoreUObject.dylib]
UObject::ProcessEvent(UFunction*, void*) Address = 0x102989f5c (filename not found) [in UnrealEditor-CoreUObject.dylib]
AActor::ProcessEvent(UFunction*, void*) Address = 0x11526943c (filename not found) [in UnrealEditor-Engine.dylib]
void TScriptDelegate<FWeakObjectPtr>::ProcessDelegate<UObject>(void*) const Address = 0x11509f8c4 (filename not found) [in UnrealEditor-Engine.dylib]
void TMulticastScriptDelegate<FWeakObjectPtr>::ProcessMulticastDelegate<UObject>(void*) const Address = 0x11508a5f8 (filename not found) [in UnrealEditor-Engine.dylib]
void TSparseDynamicDelegate<FTakeAnyDamageSignature_MCSignature, AActor, FTakeAnyDamageSignatureInfoGetter>::Broadcast<AActor*, float, UDamageType const*, AController*, AActor*>(AActor*, float, UDamageType const*, AController*, AActor*) Address = 0x1152786e4 (filename not found) [in UnrealEditor-Engine.dylib]
AActor::TakeDamage(float, FDamageEvent const&, AController*, AActor*) Address = 0x115277c58 (filename not found) [in UnrealEditor-Engine.dylib]
APawn::TakeDamage(float, FDamageEvent const&, AController*, AActor*) Address = 0x1167e78b4 (filename not found) [in UnrealEditor-Engine.dylib]
UGameplayStatics::ApplyDamage(AActor*, float, AController*, AActor*, TSubclassOf<UDamageType>) Address = 0x115e14420 (filename not found) [in UnrealEditor-Engine.dylib]
UAttack::OnHit_Implementation(AActor*, UPrimitiveComponent*, AActor*, UPrimitiveComponent*, UE::Math::TVector<double>, FHitResult const&) Address = 0x304a1b530 [/Users/jeffrey.creswell/gamedev/ryddelmyst/Ryddelmyst_5.2/Source/Ryddelmyst/Private/Attack.cpp, line 79] [in UnrealEditor-Ryddelmyst.dylib]
UHitBoxerComponent::OnHit(UPrimitiveComponent*, AActor*, UPrimitiveComponent*, UE::Math::TVector<double>, FHitResult const&) Address = 0x3049e9e50 [/Users/jeffrey.creswell/gamedev/ryddelmyst/Ryddelmyst_5.2/Source/Ryddelmyst/Private/HitBoxerComponent.cpp, line 33] [in UnrealEditor-Ryddelmyst.dylib]
UHitBoxerComponent::execOnHit(UObject*, FFrame&, void*) Address = 0x3049bf214 [/Users/jeffrey.creswell/gamedev/ryddelmyst/Ryddelmyst_5.2/Intermediate/Build/Mac/UnrealEditor/Inc/Ryddelmyst/UHT/HitBoxerComponent.gen.cpp, line 33] [in UnrealEditor-Ryddelmyst.dylib]
UFunction::Invoke(UObject*, FFrame&, void*) Address = 0x1026abde4 (filename not found) [in UnrealEditor-CoreUObject.dylib]
UObject::CallFunction(FFrame&, void*, UFunction*) Address = 0x102981fb0 (filename not found) [in UnrealEditor-CoreUObject.dylib]
UObject::ProcessContextOpcode(FFrame&, void*, bool) Address = 0x1029926bc (filename not found) [in UnrealEditor-CoreUObject.dylib]
ProcessLocalScriptFunction(UObject*, FFrame&, void*) Address = 0x10298386c (filename not found) [in UnrealEditor-CoreUObject.dylib]
void ProcessScriptFunction<void (*)(UObject*, FFrame&, void*)>(UObject*, UFunction*, FFrame&, void*, void (*)(UObject*, FFrame&, void*)) Address = 0x102982e34 (filename not found) [in UnrealEditor-CoreUObject.dylib]
ProcessLocalFunction(UObject*, UFunction*, FFrame&, void*) Address = 0x102984fec (filename not found) [in UnrealEditor-CoreUObject.dylib]
ProcessLocalScriptFunction(UObject*, FFrame&, void*) Address = 0x10298386c (filename not found) [in UnrealEditor-CoreUObject.dylib]
UFunction::Invoke(UObject*, FFrame&, void*) Address = 0x1026abde4 (filename not found) [in UnrealEditor-CoreUObject.dylib]
UObject::ProcessEvent(UFunction*, void*) Address = 0x102989f5c (filename not found) [in UnrealEditor-CoreUObject.dylib]
AActor::ProcessEvent(UFunction*, void*) Address = 0x11526943c (filename not found) [in UnrealEditor-Engine.dylib]
void TScriptDelegate<FWeakObjectPtr>::ProcessDelegate<UObject>(void*) const Address = 0x11509f8c4 (filename not found) [in UnrealEditor-Engine.dylib]
void TMulticastScriptDelegate<FWeakObjectPtr>::ProcessMulticastDelegate<UObject>(void*) const Address = 0x11508a5f8 (filename not found) [in UnrealEditor-Engine.dylib]
FComponentHitSignature_DelegateWrapper(TMulticastScriptDelegate<FWeakObjectPtr> const&, UPrimitiveComponent*, AActor*, UPrimitiveComponent*, UE::Math::TVector<double>, FHitResult const&) Address = 0x1151efea4 (filename not found) [in UnrealEditor-Engine.dylib]
void TSparseDynamicDelegate<FComponentHitSignature_MCSignature, UPrimitiveComponent, FComponentHitSignatureInfoGetter>::Broadcast<UPrimitiveComponent*, AActor*, UPrimitiveComponent*, UE::Math::TVector<double>, FHitResult>(UPrimitiveComponent*, AActor*, UPrimitiveComponent*, UE::Math::TVector<double>, FHitResult) Address = 0x115278d28 (filename not found) [in UnrealEditor-Engine.dylib]
AActor::InternalDispatchBlockingHit(UPrimitiveComponent*, UPrimitiveComponent*, bool, FHitResult const&) Address = 0x115278a78 (filename not found) [in UnrealEditor-Engine.dylib]
AActor::DispatchBlockingHit(UPrimitiveComponent*, UPrimitiveComponent*, bool, FHitResult const&) Address = 0x115278edc (filename not found) [in UnrealEditor-Engine.dylib]
UPrimitiveComponent::DispatchBlockingHit(AActor&, FHitResult const&) Address = 0x1159d58dc (filename not found) [in UnrealEditor-Engine.dylib]
USceneComponent::EndScopedMovementUpdate(FScopedMovementUpdate&) Address = 0x115a08594 (filename not found) [in UnrealEditor-Engine.dylib]
FScopedMovementUpdate::~FScopedMovementUpdate() Address = 0x115d823f4 (filename not found) [in UnrealEditor-Engine.dylib]
UCharacterMovementComponent::PerformMovement(float) Address = 0x11592d4ec (filename not found) [in UnrealEditor-Engine.dylib]
UCharacterMovementComponent::ControlledCharacterMove(UE::Math::TVector<double> const&, float) Address = 0x115942c68 (filename not found) [in UnrealEditor-Engine.dylib]
UCharacterMovementComponent::TickComponent(float, ELevelTick, FActorComponentTickFunction*) Address = 0x1159238b8 (filename not found) [in UnrealEditor-Engine.dylib]
FActorComponentTickFunction::ExecuteTick(float, ELevelTick, ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) Address = 0x115892790 (filename not found) [in UnrealEditor-Engine.dylib]
FTickFunctionTask::DoTask(ENamedThreads::Type, TRefCountPtr<FGraphEvent> const&) Address = 0x11710d3e8 (filename not found) [in UnrealEditor-Engine.dylib]
TGraphTask<FTickFunctionTask>::ExecuteTask(TArray<FBaseGraphTask*, TSizedDefaultAllocator<32>>&, ENamedThreads::Type, bool) Address = 0x11710ccc4 (filename not found) [in UnrealEditor-Engine.dylib]
FNamedTaskThread::ProcessTasksNamedThread(int, bool) Address = 0x103e95bbc (filename not found) [in UnrealEditor-Core.dylib]
FNamedTaskThread::ProcessTasksUntilQuit(int) Address = 0x103e93e74 (filename not found) [in UnrealEditor-Core.dylib]
FTaskGraphCompatibilityImplementation::ProcessThreadUntilRequestReturn(ENamedThreads::Type) Address = 0x103e9237c (filename not found) [in UnrealEditor-Core.dylib]
FTaskGraphCompatibilityImplementation::WaitUntilTasksComplete(TArray<TRefCountPtr<FGraphEvent>, TSizedInlineAllocator<4u, 32, TSizedDefaultAllocator<32>>> const&, ENamedThreads::Type) Address = 0x103e92990 (filename not found) [in UnrealEditor-Core.dylib]
FTickTaskSequencer::ReleaseTickGroup(ETickingGroup, bool) Address = 0x117104f50 (filename not found) [in UnrealEditor-Engine.dylib]
FTickTaskManager::RunTickGroup(ETickingGroup, bool) Address = 0x1170fe3e8 (filename not found) [in UnrealEditor-Engine.dylib]
UWorld::Tick(ELevelTick, float) Address = 0x11619a57c (filename not found) [in UnrealEditor-Engine.dylib]
UEditorEngine::Tick(float, bool) Address = 0x10ff7c77c (filename not found) [in UnrealEditor-UnrealEd.dylib]
UUnrealEdEngine::Tick(float, bool) Address = 0x110cd36b8 (filename not found) [in UnrealEditor-UnrealEd.dylib]
FEngineLoop::Tick() Address = 0x1006d8844 (filename not found) [in UnrealEditor]
GuardedMain(char16_t const*) Address = 0x1006e4b10 (filename not found) [in UnrealEditor]
-[UEAppDelegate runGameThread:] Address = 0x1006ffcd0 (filename not found) [in UnrealEditor]
-[FCocoaGameThread main] Address = 0x1041413d8 (filename not found) [in UnrealEditor-Core.dylib]
Unknown() Address = 0x19ab6354c (filename not found) [in Foundation]
Unknown() Address = 0x199b13fa8 (filename not found) [in libsystem_pthread.dylib]
Unknown() Address = 0x199b0eda0 (filename not found) [in libsystem_pthread.dylib]

The most recent line in that stack from my project is in the RyddelmystCharacter.gen.cpp file. The cited line 158 says:

P_GET_PROPERTY(FNameProperty,Z_Param_BoneName);

But if I run the editor with debugger attached, the exception stacktrace points me to the line above that one, which has:

P_GET_OBJECT(UPrimitiveComponent,Z_Param_FHitComponent);

Either way, for some reason the reflection system is apparently no longer able to find the expected object properties when going through the UGameplayStatics::ApplyPointDamage() → OnTakeAnyDamage event delegate function. How should I resolve this? How/when are these object properties created?

This segfault disappeared in 5.3.
I’m pretty sure the problem was that I somehow had the wrong function signature in my ultimate delegate function HandleDamage() that was registered to the AActor::OnTakeAnyDamage(). I had extra params, FHitComponent and BoneName that no longer appear in the Actor.h declaration of OnTakeAnyDamage(). I’m guessing 5.3 added some backwards compat error handling internally for this case, as my crash moved out of the generated code and into my HandleDamage() function where I was trying to call GetName() on FHitComponent, which was not nullptr but did show up as invalid address in lldb and threw a crash.

No idea how I was able to compile in the first place with an incorrect function signature… but I guess that’s the price of reflection tech – bugs move from compile to runtime!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.