UE4 делегат playfab аварийно завершает работу с пользовательскими данными Null - PullRequest
0 голосов
/ 28 марта 2020

Мы используем 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

Программа в конечном итоге вылетает. Я могу сделать это проще, спамом 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

image">

Просмотр стека вызовов мне не слишком показателен. Делегат находит функцию для вызова просто отлично. Тогда что-то ломается.

    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] 

Мой коллега считает, что, возможно, есть проблема с тем, как мы создаем делегатов. Возможно, мы достигли предела того, сколько у нас может быть, или как часто мы можем им звонить. Я открыт для любых толкований или указаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...