> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect directly to debug game servers

> Connect directly to a PlayFab multiplayer server VM via RDP or SSH to debug game server health, attach a profiler, or view real-time logs on Windows and Linux.

For troubleshooting of PlayFab Multiplayer Servers, you should first start with [LocalMultiplayerAgent](https://github.com/PlayFab/LocalMultiplayerAgent), however there are situations where you may need to connect directly. For example:

* **Environment differences:** Sometimes, the behavior of the game server might differ between the local environment and the live service.
* **Server Health:** You might need to connect directly to investigate if the server is flagged as unhealthy.
* **Directly attaching a profiler/debugger:** It can be simpler to profile the code via a direct connection.
* **Real-time log analysis:** If you follow the instructions in [Archiving and retrieving multiplayer server logs](/services/playfab/multiplayer/servers/archiving-and-retrieving-multiplayer-server-logs), you get logs when a server shuts down. To see real-time logs, you may want to connect directly.

To connect to the VM hosting your game server (either Windows or Linux), you can get Remote Desktop (RDP)/SSH credentials using the "Connect" button on playfab.com web application. You can see this button on the "Virtual Machines" page on your Multiplayer Build. You can also get credentials from the [CreateRemoteUser](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/create-remote-user) API call.

As soon as you connect to the VM, you can use the console of the operating system to monitor your game servers. The MPS service uses Docker containers to spin up game server processes. To run Docker CLI commands, you need an admin PowerShell on Windows and **sudo su -** on Linux.

<Info>
  These are advanced Docker container debugging instructions. Using these instructions may break your game servers. We do not recommend using these commands on containers running your production game servers. We strongly advise you not to take any dependency on behavior or information you see while debugging the containers. Only publicly documented APIs and behavior are supported, other things can change without notice.
</Info>

## Instructions for both Windows and Linux

#### How can I get started with Docker containers?

Regardless if you're developing on Linux or Windows, you should get acquainted with the basics of Docker containers.

You can view the docker "Get Started" guide [here (external link)](https://docs.docker.com/get-started/). To learn more about Windows Containers, see [Windows and containers](https://learn.microsoft.com/en-us/virtualization/windowscontainers/about/).

#### Once I RDP/SSH into the VM, how can I see a list of my running game servers running in Docker containers?

Use **docker ps**. You see container name and hashes and port mapping from the VM port(s) to the Docker container port(s).

#### How can I see the ports used by my game servers?

This information is listed on **docker ps**:

```
980d7e80457265230a0bf   "/bin/sh -c ./cppLin…"   About a minute ago   Up About a minute   0.0.0.0:30000->3600/tcp, 0.0.0.0:30001->3601/udp  great_archimedes
```

* `0.0.0.0:30000->3600/tcp` indicates that port 30000 on the VM is mapped onto 3600 on the container for TCP
* `0.0.0.0:30001->3601/udp` indicates that port 30001 on the VM is mapped onto 3601 on the container for UDP

For more information, see [Docker networking](https://docs.docker.com/network/).

<Note>
  In both Windows and Linux, Docker containers are part of the "playfab" Docker network. Use `docker inspect network playfab` to view information about the PlayFab network.
</Note>

#### How can I see runtime details for a container?

Once you run docker ps to get the container name, you can run **docker inspect \<ContainerName>**. You will see lots of information, like the state of the container, the volume binding on the host VM, port bindings, environment variables passed into the container and more.

#### How can I get the logs of my game server?

You can use the command **docker logs \<nameOrHash>**. These logs contain everything your app sends to standard output/standard error streams. Bear in mind that these logs are present only for existing containers. If your game server crashes, our monitoring process in the VM deletes the container and creates a new one.

It is a better practice to use GSDK to log from inside your game server. To learn more, see [Logging with GSDK](/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk#logging-with-the-gsdk) and [Archiving and retrieving multiplayer server logs](/services/playfab/multiplayer/servers/archiving-and-retrieving-multiplayer-server-logs) to access the logs from terminated game servers.

### Can I connect "inside" a running container to see what's going on?

You can do docker exec -it \<nameOrHash> PowerShell on Windows and docker exec -it \<nameOrHash> bash on Linux. There, you get access to a command line process in the container where you can issue native commands to debug/diagnose issues.

For this command to work on Linux, Bash shell must be installed in your base container. If it isn't, you can use Bourne shell by running **docker exec -it \<nameOrHash> sh**.

#### How can I see the ports that are open on my container?

Once you are connected "inside" the container, you can use **netstat -ano** on Windows and **netstat -tulpn** on Linux when you have a command line process inside your container (check the previous instruction).

If this command doesn't work on Linux, try installing netstat by **apt update && apt install net-tools**. On Linux, you can use **nestatst -tulpn** inside the VM to see that the ports are indeed open. Recall that VM ports are different than container ports, you can see this port mapping with **docker ps** for your containers.

## Linux specific instructions

#### How can I see diagnostics about my container?

You can install **apt install procps** and then run:

* **ps -aux** for the current running processes (observer that your main process in the container has a PID of 1. If this process dies, your container is gone)
* **top** for real-time process information

#### How can I monitor TCP and UDP packets?

* Consider using a tool like [TCPdump (external link)](https://www.tcpdump.org/) utility.
* Run **apt update && apt install tcpdump** to install it. In order to use it for a specific port, run **tcpdump port 7777** for TCP and **tcpdump udp port 7778** for UDP.

You can use tcpdump both from inside the VM and from inside the container. However, ensure that you are monitoring for the correct port value, since there is a port mapping between VM ports and container ports.

## Windows specific instructions

#### How can I determine the required DLLs that need to be in my asset package?

For instructions, see [Determining required DLLs](/services/playfab/multiplayer/servers/determining-required-dlls). This article is also useful if your game server fails to start because of one or more missing DLLs.

#### LocalMultiplayerAgent is crashing and restarting my Docker container with no error messages. Help!

When a crash happens, you see an output similar to `Container [ContainerId] exited with exit code 1`. For example:

```
info: PlayfabMultiplayerAgent[0]
      Waiting for heartbeats from the game server.....
info: PlayfabMultiplayerAgent[0]
      Container 4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8 exited with exit code 1.
info: PlayfabMultiplayerAgent[0]
      Collecting logs for container 4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8.
info: PlayfabMultiplayerAgent[0]
      Copying log file C:\ProgramData\Docker\containers\4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8\4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8-json.log for container 4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8 to D:\playfab\PlayFabVmAgentOutput\2020-09-29T01-42-01\GameLogs\032e7357-1956-4a60-9682-ca462cc3ea12\PF_ConsoleLogs.txt.
info: PlayfabMultiplayerAgent[0]
      Deleting container 4179fa451214251a45d1a8e8338203a9ff05dc6ec1231c50e1f81f5508b3e1c8.
```

**Debugging steps**

* Check PF\_ConsoleLogs.txt for any useful error message
* Check if your .zip asset package contains all the required DLLs for your game. For instructions, see [Determining required DLLs](/services/playfab/multiplayer/servers/determining-required-dlls).
* Check the Windows Event log to see if there's any useful information about Docker failures

#### On LocalMultiplayerAgent, I am not getting any heartbeats

There might be some leftover containers from previous attempts. You can use **docker ps -a** to see all containers and **docker rm -f \<containerNameOrTag>** to delete them.

#### On Windows, how can I monitor TCP and UDP packets?

Consider using a tool like [Wireshark (external link)](https://www.wireshark.org/) utility.

#### How can I debug a deployed multiplayer server using Visual Studio?

For instructions, see [Using Visual Studio to debug servers](/services/playfab/multiplayer/servers/allocating-game-servers-and-configuring-vs-debugging-tools#debugging-a-deployed-multiplayer-server)

## See also

* [Locally debugging game servers](/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab)


## Related topics

- [Allocate game servers and connect Visual Studio debugger](/services/playfab/multiplayer/servers/allocating-game-servers-and-configuring-vs-debugging-tools.md)
- [Debug container game servers with LocalMultiplayerAgent](/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-container-gameserver.md)
- [Debug Process-based game servers using LocalMultiplayerAgent](/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
- [GSDK Project Testing and Debugging](/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/third-person-mp-example-project-local-deployment-and-debugging.md)
- [Debug Tracing](/services/playfab/sdks/c/tracing.md)
