Мы используем Unreal Engine 4.22.3 и Playfab Blueprint API. Иногда мы получаем cra * sh, который происходит при запросе групповых данных из playfab. Это происходит по таймеру каждые 10 секунд, чтобы обеспечить доступ к самой последней информации, поскольку у нас нет службы уведомлений pu sh. Механизм обычно успешно справляется с этим, но иногда дает сбой, заявляя, что пользовательские данные, переданные делегату OnSuccess (чтобы указать идентификатор группы, для которого предназначено приглашение), равны NULL.
Обнаружив это, я обнаружил, что у других также была эта проблема на портале сообщества playfab, и их проблема заключалась в том, что объект собирался слишком быстро. После подтверждения того, что возвращенные пользовательские данные были новым объектом, я решил сохранить свои переменные в массиве до их отправки, а затем удалить их из массива, чтобы обеспечить сборку мусора после отправки.
![Custom Data stored, dispatched then removed to prevent garbage collection](https://i.stack.imgur.com/5biHv.png)
Программа в конечном итоге вылетает. Я могу сделать это проще, спамом refre sh на странице приглашения и, в свою очередь, запускаю запрос. Это однако противоречиво. Сама ошибка обычно находится в:
Исключение, сгенерированное в 0x0000000000000000 в UE4Editor-Win64-DebugGame.exe: 0xC0000005: Местоположение выполнения нарушения прав доступа 0x0000000000000000.
void UFunction::Invoke(UObject* Obj, FFrame& Stack, RESULT_DECL)
{
checkSlow(Func);
UClass* OuterClass = (UClass*)GetOuter();
if (OuterClass->IsChildOf(UInterface::StaticClass()))
{
Obj = (UObject*)Obj->GetInterfaceAddress(OuterClass);
}
TGuardValue<UFunction*> NativeFuncGuard(Stack.CurrentNativeFunction, this);
return (*Func)(Obj, Stack, RESULT_PARAM);
}
Возврат стека показывает, что пользовательские данные имеют значение NULL
">
Просмотр стека вызовов мне не слишком показателен. Делегат находит функцию для вызова просто отлично. Тогда что-то ломается.
0000000000000000() Unknown
UE4Editor-CoreUObject.dll!UObject::CallFunction(FFrame & Stack, void * const Z_Param__Result, UFunction * Function) Line 861 C++
[Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319 C++
UE4Editor-CoreUObject.dll!UObject::ProcessContextOpcode(FFrame & Stack, void * const Z_Param__Result, bool bCanFailSilently) Line 2314 C++
[Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319 C++
UE4Editor-CoreUObject.dll!UObject::execLet(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 2100 C++
[Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319 C++
UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974 C++
UE4Editor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>(UObject * Context, UFunction * Function, FFrame & Stack, void * const Z_Param__Result, void(*)(UObject *, FFrame &, void *) ExecFtor) Line 809 C++
UE4Editor-CoreUObject.dll!ProcessLocalFunction(UObject * Context, UFunction * Fn, FFrame & Stack, void * const Z_Param__Result) Line 1033 C++
[Inline Frame] UE4Editor-CoreUObject.dll!FFrame::Step(UObject *) Line 319 C++
UE4Editor-CoreUObject.dll!ProcessLocalScriptFunction(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 974 C++
UE4Editor-CoreUObject.dll!UObject::ProcessInternal(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 1058 C++
> UE4Editor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) Line 4643 C++
UE4Editor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) Line 1464 C++
UE4Editor-Engine.dll!AActor::ProcessEvent(UFunction * Function, void * Parameters) Line 769 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!TScriptDelegate<FWeakObjectPtr>::ProcessDelegate<UObject>(void * Parameters) Line 248 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!UPlayFabClientAPI::FDelegateOnSuccessGetSharedGroupData_DelegateWrapper(const TScriptDelegate<FWeakObjectPtr> & DelegateOnSuccessGetSharedGroupData, FClientGetSharedGroupDataResult result, UObject * customData) Line 2163 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!UPlayFabClientAPI::HelperGetSharedGroupData(FPlayFabBaseModel response, UObject * customData, bool successful) Line 8374 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!UPlayFabClientAPI::execHelperGetSharedGroupData(UObject * Context, FFrame & Stack, void * const Z_Param__Result) Line 29 C++
UE4Editor-CoreUObject.dll!UFunction::Invoke(UObject * Obj, FFrame & Stack, void * const Z_Param__Result) Line 4643 C++
UE4Editor-CoreUObject.dll!UObject::ProcessEvent(UFunction * Function, void * Parms) Line 1464 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!TScriptDelegate<FWeakObjectPtr>::ProcessDelegate<UObject>(void * Parameters) Line 248 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!TMulticastScriptDelegate<FWeakObjectPtr>::ProcessMulticastDelegate<UObject>(void * Parameters) Line 494 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!FOnPlayFabClientRequestCompleted_DelegateWrapper(const TMulticastScriptDelegate<FWeakObjectPtr> & OnPlayFabClientRequestCompleted, FPlayFabBaseModel response, UObject * customData, bool successful) Line 24 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!UPlayFabClientAPI::OnProcessRequestComplete(TSharedPtr<IHttpRequest,0> Request, TSharedPtr<IHttpResponse,1> Response, bool bWasSuccessful) Line 9219 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!TMemberFunctionCaller<UPlayFabClientAPI,void (__cdecl UPlayFabClientAPI::*)(TSharedPtr<IHttpRequest,0>,TSharedPtr<IHttpResponse,1>,bool)>::operator()<TSharedPtr<IHttpRequest,0> &,TSharedPtr<IHttpResponse,1> &,bool &>(TSharedPtr<IHttpRequest,0> & <Args_0>, TSharedPtr<IHttpResponse,1> & <Args_1>, bool & <Args_2>) Line 157 C++
UE4Editor-PlayFab-Win64-DebugGame.dll!TBaseUObjectMethodDelegateInstance<0,UPlayFabClientAPI,void __cdecl(TSharedPtr<IHttpRequest,0>,TSharedPtr<IHttpResponse,1>,bool)>::ExecuteIfSafe(TSharedPtr<IHttpRequest,0> <Params_0>, TSharedPtr<IHttpResponse,1> <Params_1>, bool <Params_2>) Line 677 C++
UE4Editor-HTTP.dll!TBaseDelegate<void,TSharedPtr<IHttpRequest,0>,TSharedPtr<IHttpResponse,1>,bool>::ExecuteIfBound(TSharedPtr<IHttpRequest,0> <Params_0>, TSharedPtr<IHttpResponse,1> <Params_1>, bool <Params_2>) Line 648 C++
UE4Editor-HTTP.dll!FCurlHttpRequest::FinishedRequest() Line 1092 C++
UE4Editor-HTTP.dll!FHttpManager::Tick(float DeltaSeconds) Line 199 C++
[Inline Frame] UE4Editor-Core.dll!TBaseDelegate<bool,float>::Execute(float) Line 561 C++
[Inline Frame] UE4Editor-Core.dll!FTicker::FElement::Fire(float) Line 127 C++
UE4Editor-Core.dll!FTicker::Tick(float DeltaTime) Line 95 C++
UE4Editor-Win64-DebugGame.exe!FEngineLoop::Tick() Line 4167 C++
[Inline Frame] UE4Editor-Win64-DebugGame.exe!EngineTick() Line 62 C++
UE4Editor-Win64-DebugGame.exe!GuardedMain(const wchar_t * CmdLine, HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, int nCmdShow) Line 168 C++
UE4Editor-Win64-DebugGame.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) Line 261 C++
[External Code]
Мой коллега считает, что, возможно, есть проблема с тем, как мы создаем делегатов. Возможно, мы достигли предела того, сколько у нас может быть, или как часто мы можем им звонить. Я открыт для любых толкований или указаний.