Gamelift Health Check Issue With Unreal Engine 5

0

We are using Unreal Engine version 5.0 along with a plugin that is linked below that allows us to interface with AWS SDK in blueprints. This was working on a test project but when we went into a new project it started giving us the "SERVER_PROCESS_TERMINATED_UNHEALTHY " after our fleet is activated. We have verified that we are making all the correct SDK calls to initialize gamelift but have not been able to fix the error below. The code below is a log from the aws server machine that we acquired via SSH. We have also made sure that the "libaws-cpp-sdk-gamelift-server.so" file is properly linked to the Linux executable.

[2023.01.24-15.34.54:491][  0]LogLoad: (Engine Initialization) Total time: 34.90 seconds^M
[2023.01.24-15.34.54:525][  0]LogNet: UNetDriver::TickDispatch: Very long time between ticks. DeltaTime: 0.03, Realtime: 14.61. IpNetDriver_2147482510^M
[2023.01.24-15.34.54:559][  1]LogLevel: ActivateLevel /Game/Maps/PowEng2/L_PE2_Gameplay 1 1 0^M
[2023.01.24-15.45.05:534][255]LogStreaming: Display: 0.023 ms (0.005+0.018) ms for processing 46/46 objects in NotifyUnreachableObjects( Queued=0, Async=0). Removed 0/0 (1374->1374 tracked) packages and 10/46 (3569->3559 tracked) public exports.^M
[2023.01.24-15.45.57:509][727]LogCore: === Critical error: ===
Unhandled Exception: SIGSEGV: unaligned memory access (SIMD vectors?)
^M
[2023.01.24-15.45.57:509][727]LogCore: Fatal error!

0x00000000060892cc Moh_PowerEngServer!UClass::FindFunctionByName(FName, EIncludeSuperFlag::Type) const [A:/Jenkins/workspace/UE5_Dev/UE5/Engine/Source/./Runtime/CoreUObject/Private/UObject/Class.cpp:5523]
0x00000000062367cf Moh_PowerEngServer!UObject::FindFunctionChecked(FName) const [A:/Jenkins/workspace/UE5_Dev/UE5/Engine/Source/./Runtime/CoreUObject/Private/UObject/ScriptCore.cpp:1320]
0x0000000004ed01d9 Moh_PowerEngServer!UProcessParameters::HealthCheck() [A:/Jenkins/workspace/UE5_Dev/UE5/Engine/Source/./../../Projects/Mohawk/Moh_PowerEng/Intermediate/Build/Linux/B4D820EA/Moh_PowerEngServer/Inc/GameLiftServerSDK/ProcessParameters.gen.cpp:53]
0x00007f5580b28dee libaws-cpp-sdk-gamelift-server.so!UnknownFunction(0x40ded)
0x00007f5580b1da0e libaws-cpp-sdk-gamelift-server.so!UnknownFunction(0x35a0d)
0x00007f55814b71db libpthread.so.0!UnknownFunction(0x61da)
0x00007f5580b2b5ec libaws-cpp-sdk-gamelift-server.so!UnknownFunction(0x435eb)
0x00007f557ff38890 libstdc++.so.6!UnknownFunction(0xbb88f)
0x00007f55814b8e75 libpthread.so.0!UnknownFunction(0x7e74)
0x00007f5580516a2d libc.so.6!clone(+0x6c)

Plugin Link: https://www.unrealengine.com/marketplace/en-US/product/aws-cognito-dynamodb-gamelift-lambda

asked a year ago772 views
3 Answers
0

I am currently working on Unreal Engine 5.1.1 game project. I have integrated GameLiftServerSDK in to our game as we want to use dedicated servers hosted on AWS GameLift. I have downloaded latest version of Unreal - GameLift plugin SDK (5.0.0) and fallowed latest tutorial for integration in to UE.

For testing purpose I have created simple Unreal project from Third Person Template with GameLiftServerSDK plugin. I have added code from latest integration guide: https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-engines-setup-unreal.html to the GameMode class of the test project.

I have access to Amazon GameLift Console where I have setup Fleet (type Anywhere) and I have configured my desktop workstation as compute in custom location in that fleet. Before running dedicated server package, I run aws gamelift get-compute-auth-token command, and use token as parameter in executable shortcut.

Every time I try to run dedicated server (with all preparations) I get crash EXCEPTION_ACCESS_VIOLATION <CallStack>ProjectServer!OnHealthCheckInternal() ...\Plugins\GameLiftServerSDK\Source\GameLiftServerSDK\Private\GameLiftServerSDK.cpp:245]

answered a year ago
  • I have the exact same problem. Were you able to solve it?

0

Hi,

Amazon GameLift has added support for Unreal Engine 5, please check out the latest developer guide for instruction to integrate: https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-engines-setup-unreal.html

Related: https://aws.amazon.com/about-aws/whats-new/2023/04/amazon-gamelift-unreal-engine-5/

AWS
fzehao
answered a year ago
0

I have found solution. Add private member variables:

FGameLiftServerSDKModule* GameLiftSdkModule;
FProcessParameters GameLiftProcessParams;
FServerParameters serverParameters;

To your YourProjectGameMode class. Do not use lambda functions for delegates OnHealthCheck, OnTerminate and onGameSession but create regular functions and bind them to delegates.

UYourProjectGameMode::UYourProjectGameMode() {
...
        GameLiftSdkModule = nullptr;
	GameLiftProcessParams.OnStartGameSession.BindUObject(this, &UYourProjectGameMode::OnGameSessionActivated);
	GameLiftProcessParams.OnUpdateGameSession.BindUObject(this, &UYourProjectGameMode::OnUpdateGameSessionReceived);
	GameLiftProcessParams.OnHealthCheck.BindUObject(this, &UYourProjectGameMode::OnHealthCheckReceived);
	GameLiftProcessParams.OnTerminate.BindUObject(this, &UYourProjectGameMode::OnTerminateServerProcess);
...
}

void UYourProjectGameMode::InitGameLift()
{
	UE_LOG(LogTemp, Log, TEXT("Initializing the GameLift Server"));

	GameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK"));
...
}
void UYourProjectGameMode::OnGameSessionActivated(Aws::GameLift::Server::Model::GameSession ActivatedSession)
{
	// When a game session is created, GameLift sends an activation request to the game server and passes along the game session object
	// containing game properties and other settings.
	// Here is where a game server should take action based on the game session object.
	// Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession()

	CurrentGameSessionId = FString(ActivatedSession.GetGameSessionId());
	UE_LOG(LogTemp, Log, TEXT("GameSession Initializing: %s"), *CurrentGameSessionId);
	if (GameLiftSdkModule != nullptr)
	{
		GameLiftSdkModule->ActivateGameSession();
	}
}

void UYourProjectGameMode::OnUpdateGameSessionReceived(Aws::GameLift::Server::Model::UpdateGameSession UpdatedSession)
{
	FString gameSessionId = FString(UpdatedSession.GetGameSession().GetGameSessionId());
	UE_LOG(LogTemp, Log, TEXT("GameSession Updated: %s"), *gameSessionId);
	//GameLiftSdkModule->ActivateGameSession();
}

bool UYourProjectGameMode::OnHealthCheckReceived()
{
	// This is the HealthCheck callback. GameLift will invoke this callback every 60 seconds or so.
	// Here, a game server might want to check the health of dependencies and such. Simply return true if healthy, false otherwise.
	// The game server has 60 seconds to respond with its health status. GameLift will default to 'false' if the game server doesn't respond in time.
	// In this case, we're always healthy!

	UE_LOG(LogTemp, Log, TEXT("Performing Health Check"));
	return true;
}

void UYourProjectGameMode::OnTerminateServerProcess()
{
	// OnProcessTerminate callback. GameLift will invoke this callback before shutting down an instance hosting this game server.
	// It gives this game server a chance to save its state, communicate with services, etc., before being shut down.
	// In this case, we simply tell GameLift we are indeed going to shutdown.

	UE_LOG(LogTemp, Log, TEXT("Game Server Process is terminating"));
	if (GameLiftSdkModule != nullptr)
	{
		GameLiftSdkModule->ProcessEnding();
	}
}
answered a year ago

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.

Guidelines for Answering Questions