> ## 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.

# 直接连接以调试游戏服务器

> 通过 RDP 或 SSH 直接连接到 PlayFab 多人游戏服务器虚拟机，以在 Windows 和 Linux 上调试游戏服务器运行状况、附加分析器或查看实时日志。

对于 PlayFab Multiplayer Servers 的故障排除，您应该首先从 [LocalMultiplayerAgent](https://github.com/PlayFab/LocalMultiplayerAgent) 开始，但在某些情况下您可能需要直接连接。例如：

* **环境差异：** 有时，游戏服务器的行为可能在本地环境和实时服务之间有所不同。
* **服务器运行状况：** 如果服务器被标记为不健康，您可能需要直接连接以进行调查。
* **直接附加分析器/调试器：** 通过直接连接分析代码可能更简单。
* **实时日志分析：** 如果按照[存档和检索多人游戏服务器日志](/services/playfab/multiplayer/servers/archiving-and-retrieving-multiplayer-server-logs)中的说明进行操作，则在服务器关闭时会获得日志。要查看实时日志，您可能需要直接连接。

要连接到托管游戏服务器的虚拟机（Windows 或 Linux），您可以使用 playfab.com Web 应用程序上的 "Connect" 按钮获取远程桌面 (RDP)/SSH 凭据。您可以在 Multiplayer Build 的 "Virtual Machines" 页面上看到此按钮。您还可以从 [CreateRemoteUser](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/create-remote-user) API 调用获取凭据。

连接到虚拟机后，您可以使用操作系统的控制台来监控游戏服务器。MPS 服务使用 Docker 容器来启动游戏服务器进程。要运行 Docker CLI 命令，您需要在 Windows 上使用管理员 PowerShell，在 Linux 上使用 **sudo su -**。

<Info>
  这些是高级 Docker 容器调试说明。使用这些说明可能会破坏您的游戏服务器。我们不建议在运行生产游戏服务器的容器上使用这些命令。我们强烈建议您不要依赖调试容器时看到的行为或信息。仅支持公开记录的 API 和行为，其他内容可能在没有通知的情况下发生变化。
</Info>

## 适用于 Windows 和 Linux 的说明

#### 如何开始使用 Docker 容器？

无论您是在 Linux 还是 Windows 上开发，您都应该熟悉 Docker 容器的基础知识。

您可以在[此处（外部链接）](https://docs.docker.com/get-started/)查看 docker "Get Started" 指南。要了解有关 Windows 容器的更多信息，请参阅 [Windows 和容器](https://learn.microsoft.com/en-us/virtualization/windowscontainers/about/)。

#### 一旦我通过 RDP/SSH 进入虚拟机，如何查看在 Docker 容器中运行的游戏服务器列表？

使用 **docker ps**。您将看到容器名称、哈希以及从虚拟机端口到 Docker 容器端口的端口映射。

#### 如何查看游戏服务器使用的端口？

此信息在 **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` 表示虚拟机上的端口 30000 映射到容器上的 3600 用于 TCP
* `0.0.0.0:30001->3601/udp` 表示虚拟机上的端口 30001 映射到容器上的 3601 用于 UDP

有关更多信息，请参阅 [Docker 网络](https://docs.docker.com/network/)。

<Note>
  在 Windows 和 Linux 中，Docker 容器都是 "playfab" Docker 网络的一部分。使用 `docker inspect network playfab` 查看有关 PlayFab 网络的信息。
</Note>

#### 如何查看容器的运行时详细信息？

运行 docker ps 获取容器名称后，您可以运行 **docker inspect \<ContainerName>**。您将看到大量信息，如容器状态、主机虚拟机上的卷绑定、端口绑定、传递到容器中的环境变量等。

#### 如何获取游戏服务器的日志？

您可以使用命令 **docker logs \<nameOrHash>**。这些日志包含您的应用程序发送到标准输出/标准错误流的所有内容。请记住，这些日志仅存在于现有容器。如果游戏服务器崩溃，我们在虚拟机中的监控进程会删除该容器并创建一个新的。

最好在游戏服务器内部使用 GSDK 进行日志记录。要了解更多信息，请参阅[使用 GSDK 进行日志记录](/services/playfab/multiplayer/servers/integrating-game-servers-with-gsdk#logging-with-the-gsdk)和[存档和检索多人游戏服务器日志](/services/playfab/multiplayer/servers/archiving-and-retrieving-multiplayer-server-logs)以访问已终止游戏服务器的日志。

### 我可以连接到运行中的容器"内部"查看正在发生的情况吗？

您可以在 Windows 上执行 docker exec -it \<nameOrHash> PowerShell，在 Linux 上执行 docker exec -it \<nameOrHash> bash。在那里，您可以访问容器中的命令行进程，在其中您可以发出本机命令来调试/诊断问题。

要使此命令在 Linux 上工作，必须在基础容器中安装 Bash shell。如果没有，可以通过运行 **docker exec -it \<nameOrHash> sh** 来使用 Bourne shell。

#### 如何查看容器上打开的端口？

一旦您连接到容器"内部"，在容器内有命令行进程时，可以在 Windows 上使用 **netstat -ano**，在 Linux 上使用 **netstat -tulpn**（请查看前面的说明）。

如果此命令在 Linux 上不起作用，请尝试通过 **apt update && apt install net-tools** 安装 netstat。在 Linux 上，您可以在虚拟机内部使用 **nestatst -tulpn** 查看端口确实是打开的。请记住，虚拟机端口与容器端口不同，您可以通过 **docker ps** 查看容器的端口映射。

## Linux 特定说明

#### 如何查看有关容器的诊断信息？

您可以安装 **apt install procps**，然后运行：

* **ps -aux** 查看当前运行的进程（观察您在容器中的主进程 PID 为 1。如果该进程终止，则您的容器不复存在）
* **top** 获取实时进程信息

#### 如何监控 TCP 和 UDP 数据包？

* 考虑使用 [TCPdump（外部链接）](https://www.tcpdump.org/) 之类的工具。
* 运行 **apt update && apt install tcpdump** 进行安装。要将其用于特定端口，请对 TCP 运行 **tcpdump port 7777**，对 UDP 运行 **tcpdump udp port 7778**。

您可以从虚拟机内部和容器内部使用 tcpdump。但是，请确保您监控的是正确的端口值，因为虚拟机端口和容器端口之间存在端口映射。

## Windows 特定说明

#### 如何确定资产包中所需的 DLL？

有关说明，请参阅[确定所需的 DLL](/services/playfab/multiplayer/servers/determining-required-dlls)。如果游戏服务器由于缺少一个或多个 DLL 而无法启动，本文也很有用。

#### LocalMultiplayerAgent 正在崩溃并重启我的 Docker 容器，且没有错误消息。帮助！

发生崩溃时，您会看到类似 `Container [ContainerId] exited with exit code 1` 的输出。例如：

```
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.
```

**调试步骤**

* 检查 PF\_ConsoleLogs.txt 中是否有任何有用的错误消息
* 检查您的 .zip 资产包是否包含游戏所需的所有 DLL。有关说明，请参阅[确定所需的 DLL](/services/playfab/multiplayer/servers/determining-required-dlls)。
* 检查 Windows 事件日志，查看是否有关于 Docker 故障的任何有用信息

#### 在 LocalMultiplayerAgent 上，我没有收到任何心跳

以前的尝试可能还有一些残留容器。您可以使用 **docker ps -a** 查看所有容器，并使用 **docker rm -f \<containerNameOrTag>** 删除它们。

#### 在 Windows 上，如何监控 TCP 和 UDP 数据包？

考虑使用 [Wireshark（外部链接）](https://www.wireshark.org/) 之类的工具。

#### 如何使用 Visual Studio 调试已部署的多人游戏服务器？

有关说明，请参阅[使用 Visual Studio 调试服务器](/services/playfab/multiplayer/servers/allocating-game-servers-and-configuring-vs-debugging-tools#debugging-a-deployed-multiplayer-server)

## 另请参阅

* [本地调试游戏服务器](/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab)


## Related topics

- [在本地调试游戏服务器以及与 PlayFab 的集成](/zh-CN/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab.md)
- [分配游戏服务器并连接 Visual Studio 调试器](/zh-CN/services/playfab/multiplayer/servers/allocating-game-servers-and-configuring-vs-debugging-tools.md)
- [使用 LocalMultiplayerAgent 调试容器游戏服务器](/zh-CN/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-container-gameserver.md)
- [使用 LocalMultiplayerAgent 调试基于进程的游戏服务器](/zh-CN/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
- [将客户端连接到游戏服务器](/zh-CN/services/playfab/multiplayer/servers/connecting-clients-to-game-servers.md)
