getnamo / UDP-Unreal

Convenience UDP wrapper for the Unreal Engine.
MIT License
335 stars 79 forks source link

UE5.1 Editor crashes when stopping PIE while data is being received #33

Closed Gliptal closed 6 months ago

Gliptal commented 1 year ago

Whenever PIE is stopped while a datastream is still sending UDP packets on a socket handled by UDPWrapper, the editor crashes with with the following trace:

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000008

UnrealEditor_UDPWrapper!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<0>,void __cdecl(TArray<unsigned char,TSizedDefaultAllocator<32> > const &,FString const &,int const &)>::operator()() [C:\Unreal Engine\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\Function.h:602] UnrealEditor_Core!TGraphTask::ExecuteTask() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:1348] UnrealEditor_Core!FNamedTaskThread::ProcessTasksNamedThread() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:760] UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilIdle() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:660] UnrealEditor_Engine!FFrameEndSync::Sync() [D:\build++UE5\Sync\Engine\Source\Runtime\Engine\Private\UnrealEngine.cpp:12391] UnrealEditor!FEngineLoop::Tick() [D:\build++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5592] UnrealEditor!GuardedMain() [D:\build++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:202] UnrealEditor!GuardedMainWrapper() [D:\build++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:107] UnrealEditor!LaunchWindowsStartup() [D:\build++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:244] UnrealEditor!WinMain() [D:\build++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:282] UnrealEditor!__scrt_common_main_seh() [D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288] kernel32 ntdll

getnamo commented 1 year ago

Which callback type are you using? Got some examples?

Gliptal commented 1 year ago

I add a dynamic delegate in the constructor of an UCLASS of mine:

socket->OnReceivedBytes.AddDynamic(this, &AMyClass::OnReceive);

The function is declared as:

UFUNCTION()
virtual void OnReceive(const TArray<uint8>& Data, const FString& SourceIp, const int& SourcePort);

That function is defined in AMyClass and then overridden by child classes.

Gliptal commented 1 year ago

I tried commenting my AddDynamic() call and I still get a crash. I have no other AddDynamic() calls related to UDPWrapper anywhere else in the project.

Does port 55971 ring a bell?

rider64_xZZ50qBwK9

After some more testing it seems like the culprit is something within the code that opens the receive socket.

getnamo commented 1 year ago

Looking at https://github.com/getnamo/UDP-Unreal/blob/master/Source/UDPWrapper/Private/UDPComponent.cpp#L270, just checking do you have 'receive data on game thread' enabled? If not it's possible you're getting a callback when the game is being unwound on a separate thread. Test with receive on gamethread enabled and see if that changes anything.

wenzheng-wen commented 1 year ago

Hi.So it will work properly on ue5?

Gliptal commented 6 months ago

I closed this issue since I haven't seen this error in more than a year.