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

# 游戏存档调试

> 修复常见的 XBOX GDK 游戏存档错误，包括 SCID 配置错误、合作伙伴中心的 Connected Storage 设置、句柄清理和 NTSTATUS 代码。

本文介绍了需要调试的常见游戏存档场景以及如何修复它们。

## 常见游戏存档错误场景

### 服务配置标识符配置错误

如果在调用 [XGameSaveFilesGetFolderWithUiAsync](/reference/system/xgamesavefiles/functions/xgamesavefilesgetfolderwithuiasync) 时出现错误 0x80830002 (E\_GS\_NO\_ACCESS)，则可能是源代码中的服务配置标识符 (SCID) 不正确。请确保 SCID 与 Microsoft 合作伙伴中心中显示的一致。可能会显示以下系统错误消息。

<img src="https://mintcdn.com/microsoft-4404708b/CwRBzaXvHw9zaPoe/images/gdk/features/common/temporary-network-error.png?fit=max&auto=format&n=CwRBzaXvHw9zaPoe&q=85&s=d43a9f64593871f84957ae415351e491" alt="对话框：出现暂时性网络问题。" width="2218" height="923" data-path="images/gdk/features/common/temporary-network-error.png" />

#### 游戏绑定的影响

如果你的标题使用[游戏绑定](/services/xbox-services/fundamentals/game-binding/game-binding-overview)，之后又添加了 PC 版 Microsoft Game Development Kit (GDK)，则必须使用主产品的 Microsoft 帐户 (MSA) AppID (MSAppID)。使用次产品的 MSAAppID 会导致 0x80830002 错误。

### 合作伙伴中心设置错误

合作伙伴中心设置错误可能是游戏存档错误的常见原因。要使用户游戏存档能够同步到云端和从云端同步，请在合作伙伴中心的**游戏玩法设置** > **标题存储**中选择 **Connected Storage** 选项。下图显示了确保游戏存档能够正确地同步到云端和从云端同步所需的合作伙伴中心 Connected Storage 配置设置。

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/partner-center-config-setup.png?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=3e538fa1fdfd3ea926e2dea68e8ed584" alt="合作伙伴中心 Connected Storage 配置设置。" width="2187" height="895" data-path="images/gdk/features/common/partner-center-config-setup.png" />

### 句柄清理

游戏存档同步到云端和从云端同步是通过多个句柄管理的。如果这些句柄的生命周期未得到正确管理，则可能在同步到云端和从云端同步时导致未定义行为。

`XGameSaveFiles`：

* 当标题启动和恢复时调用 [XGameSaveFilesGetFolderWithUiAsync](/reference/system/xgamesavefiles/functions/xgamesavefilesgetfolderwithuiasync)。此调用会隐式创建一个游戏存档提供程序句柄。当标题挂起或终止时，操作系统会释放它。

`XGameSave`：

* 在 [XGameSaveSubmitUpdate](/reference/system/xgamesave/functions/xgamesavesubmitupdate) 调用之后删除 `XGameSaveUpdateHandle`，无论更新成功还是失败。
* 当标题挂起或终止时删除 `XGameSaveContainerHandle`。
* 当标题挂起或终止时删除 `XGameSaveProviderHandle`。

### 确认游戏存档

要确认你的游戏存档正在上传到云端，标题需要开始释放对标题的锁的过程，然后开始上传数据。你可以通过 Fiddler [检查游戏存档网络流量](/build/core-features/common/game-save/game-saves-tools#inspecting-game-saves-network-traffic)来查看此流量。

有关游戏存档同步流程的更多信息，请参阅[理解游戏存档同步流程](/build/core-features/common/game-save/game-saves-syncing)。

## 常见错误

| 错误代码       | 名称                      | 描述                   | 故障排除                                                                                                                                                                                                                                                       |
| ---------- | ----------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0x80830002 | E\_GS\_NO\_ACCESS       | 操作失败，因为标题无权访问容器存储空间。 | 如果 SCID 和 TitleID 未正确配置，会导致 API 调用失败，从而出现此错误。请检查你游戏的 .config 文件中是否有正确的 TitleID，以及源代码中是否有正确的 SCID。<br /><br />主机系统提示上显示的错误消息为"可能存在服务中断。请检查服务状态。如果发生服务中断，请稍等再试，或者在离线状态下使用此游戏或应用。"<br /> <br />当尝试访问未提供适当跨标题访问策略的其他标题时，会发生此错误。在合作伙伴中心中配置所需的访问策略，以启用跨标题的加载和保存。 |
| 0x000000DF | ERROR\_FILE\_TOO\_LARGE | 文件大小超过允许的限制，无法保存。    | 当尝试将数据写入超过 256 MB 标题配额的 `XGameSaveFiles` 路径时，会发生此错误。此错误与 E\_QUOTA\_EXCEEDED 相同。<br /><br />有关更多信息，请参阅[存储系统限制和配额](/build/core-features/common/game-save/game-saves-storage-systems#limits-and-quotas)。                                                      |
| 0x80830004 | E\_GS\_USER\_CANCELED   | 用户取消了保存的游戏下载。        | 如果用户取消同步尝试，导致提供程序在尝试获取锁时失败，就会发生此错误。                                                                                                                                                                                                                        |

如果同步尝试被拒绝，请再次调用 `XGameSaveFilesGetFolderWithUI`，以便文件路径写入本地。此调用返回 `S_OK`。

在使用过期的提供程序调用 `XGameSaveFilesGetFolderWithUIResult` 时也会发生此错误。当游戏运行时服务 (GRTS) 在挂起标题或发生其他系统管理事件时取消初始化游戏存档提供程序时，也会发生此错误。当标题恢复时，调用 `XGameSaveFilesGetFolderWithUiAsync` 以重新初始化提供程序并确保保存的数据是最新的。如果标题在未进行此调用的情况下恢复，则提供程序仍处于未初始化状态。游戏存档操作会失败。| | 0x8007000E | E\_OUTOFMEMORY | 剩余内存不足以处理你的请求。  | 此错误通常由多种原因引起。你可以使用 PIX 捕获内存分配并检查内存泄漏。<br />  <br />请注意以下几点：<br />  <br />1. 句柄是引用计数的。检查句柄泄漏。在成功或失败的更新之后关闭已更新的句柄。避免有大量待处理的更新。<br />  <br />2. 使用 `XMemTransferMemory` 作为解决方法，将某些内存转移到系统分区。<br />  <br />3. 严重的内存碎片。 | | 0x80070057 | E\_INVALIDARG | 提供的参数无效。参数不正确。 | 如果在 PC 上 `XGameSaveFilesGetFolderWithUI` 中使用的 SCID 不是有效的 GUID，则可能会发生此错误。 | | ---        | ---  | `XGameSaveFilesGetFolderWithUI` 无限期挂起或偶发失败。 | 请确保你正在运行的机器上没有打开的 GameSave 系统对话框，或者其他控制台上没有针对该用户显示的对话框。忽略打开的登录或同步对话框会导致未定义行为。 | 0x80830006 | E\_QUOTA\_EXCEEDED | 游戏超出了游戏的每用户配额。默认情况下，此配额为 256 MB。 | 使用以下游戏存档数据管理最佳实践。<br />  <br />1. 不要跨容器存储相关数据。<br />  <br />2. 减少容器中的 blob 数量以提高性能。<br /><br />有关更多信息，请参阅[存储系统限制和配额](/build/core-features/common/game-save/game-saves-storage-systems#limits-and-quotas) | | 0x80830005 | E\_GS\_UPDATE\_TOO\_BIG  | 保存更新的大小过大。 | `XGameSave` 更新的总大小必须小于 GS\_MAX\_BLOB\_SIZE (16 MB)，无论更新上下文中的 blob 总数如何。 | | 0x8924010c | E\_GAMERUNTIME\_INVALID\_HANDLE  | 此句柄值不再有效。  | 当尝试重用来自先前用户的未关闭句柄时，会发生此错误。请关闭不再使用的句柄。 | | 0x80830001 | E\_GS\_INVALID\_CONTAINER\_NAME | 容器的名称无效。 | 路径部分（直至并包括最后一个斜杠）的有效字符包括大写字母 (A-Z)、小写字母 (a-z)、数字 (0-9)、下划线 (\_) 和正斜杠 (/)。路径部分可以为空。<br /> <br />文件名部分（最后一个斜杠之后的所有内容）的有效字符包括大写字母 (A-Z)、小写字母 (a-z)、数字 (0-9)、下划线 (\_)、句点 (.) 和连字符 (-)。文件名不能为空、以句点结尾或包含两个连续的句点。  | | 0x80830003 | E\_GS\_OUT\_OF\_LOCAL\_STORAGE  | 设备没有足够的存储容量来保存游戏。  | 用户必须在设备上腾出可用的游戏存档存储空间。即使每用户配额未超出，也可能发生此错误。<br /><br />有关更多信息，请参阅[通过设备管理游戏存档](/build/core-features/common/game-save/game-saves-walkthroughs-and-samples#managing-game-saves-through-the-device)。  | | 0x80830007 | E\_GS\_PROVIDED\_BUFFER\_TOO\_SMALL  | 提供给 API 的缓冲区太小。  | 如果调用方向游戏存档 API 传入的缓冲区小于读取的 blob 数据大小，则会发生此错误。如果使用 `Async` 调用，请调用 [XAsyncGetResultSize](/reference/system/xasync/functions/xasyncgetresultsize) 以确保使用正确的缓冲区大小。  | | 0x80830008 | E\_GS\_BLOB\_NOT\_FOUND | 找不到指定的 blob。  | 要确认某个 blob 是否存在，可以使用 `xbstorage` 或 `gamesaveutil` 工具下载该 blob。在标题释放锁后（挂起或终止时）执行此步骤以防止未定义行为。<br /><br />有关更多信息，请参阅[游戏存档工具](/build/core-features/common/game-save/game-saves-tools)。  | | 0x80830009 | E\_GS\_NO\_SERVICE\_CONFIGURATION  | 标题未正确配置以进行 Connected Storage。   | 当 SCID 不正确或者标题未在合作伙伴中心中正确配置时，会发生此错误。<br /><br />有关更多信息，请参阅[合作伙伴中心配置](/build/core-features/common/game-save/game-saves-walkthroughs-and-samples#partner-center-configurations)。  | | 0x8083000A | E\_GS\_CONTAINER\_NOT\_IN\_SYNC  | 容器尚未同步。   | 请确保在向 XGameSave 容器提交更新之前，该容器已同步。  | | 0x8083000B | E\_GS\_CONTAINER\_SYNC\_FAILED  | 容器同步失败。 | 请确认从云端同步数据时互联网连接稳定。  | | 0x8083000C | E\_GS\_USER\_NOT\_REGISTERED\_IN\_SERVICE | 表示用户的 MSA 还不是 XBOX services 帐户。      | 请确认你正在使用的用户在合作伙伴中心中已正确注册。   | | 0x8083000D | E\_GS\_HANDLE\_EXPIRED  | 函数使用的句柄已过期，必须重新获取。  | 在提交之后或标题挂起时，`XGameSaveUpdateHandle` 不能被重用 | | 0x8083000E | E\_GS\_ASYNC\_FUNCTION\_REQUIRED  | 该函数正在时间敏感的线程上被调用，有死锁风险。  | 请改用异步实现。  | | 0x8083000F | E\_GS\_PROVIDER\_MISMATCH | 游戏混用了 `XGameSave` 和 `XGameSaveFiles` 调用，这不受支持。   | 一次只能在一个标题中初始化一种类型的游戏存档 API。此外，一个标题应使用一种游戏存档 API。在你处理多个标题的情况下，有方法可以在不同 API 之间进行互操作。<br /><br />有关更多信息，请参阅 [XGameSave 和 XGamesaveFiles 之间的互操作](/build/core-features/common/game-save/game-saves-walkthroughs-and-samples#interop-between-xgamesave-and-xgamesavefiles)  | | 0x80831001 | E\_GS\_TERMINATEDTITLE\_STALE\_DATA<br />或<br />`TerminateApplicationAfterSuspend`| 此信息不通过面向用户的 API 公开。此行为是预期的。当进程生命周期管理 (PLM) 检测到过期数据并且设备重新连接到互联网时，它会停止标题。在挂起事件之后，应用程序会关闭。 | 此调试输出不是 bug。当游戏因在初始化时（例如离线播放或冲突对话框选择期间）缺少游戏存档锁而终止时，操作系统会在挂起时终止游戏以确保下次启动时状态干净。  |

### Win32 NTSTATUS 代码

使用 `XGameSaveFiles` 时，可能会出现以下状态代码。

| 值          | 名称                              | `XGameSaveFiles` 描述              |
| ---------- | ------------------------------- | -------------------------------- |
| 0xC0000106 | STATUS\_NAME\_TOO\_LONG         | 目录名称过长。                          |
| 0xC0000033 | STATUS\_OBJECT\_NAME\_INVALID   | 目录名称包含云服务中无效的字符。                 |
| 0xC0000106 | STATUS\_NAME\_TOO\_LONG         | 文件名（包括文件夹路径）过长。                  |
| 0xC0000904 | STATUS\_FILE\_TOO\_LARGE        | 文件大小超过 64 MB，或游戏超出了每用户的最大游戏存档配额。 |
| 0xC000009A | STATUS\_INSUFFICIENT\_RESOURCES | 游戏超出了设备上分配的存储空间。                 |

## 参考 API 文档

* [XGameSave (API 内容)](/reference/system/xgamesave/xgamesave_members)
  * 函数
    * [XGameSaveSubmitUpdate](/reference/system/xgamesave/functions/xgamesavesubmitupdate)
* [XGameSaveFiles (API 内容)](/reference/system/xgamesavefiles/xgamesavefiles_members)
  * 函数
    * [XGameSaveFilesGetFolderWithUiAsync](/reference/system/xgamesavefiles/functions/xgamesavefilesgetfolderwithuiasync)
* [xasync (API 内容)](/reference/system/xasync/xasync_members)
  * 函数
    * [XAsyncGetResultSize](/reference/system/xasync/functions/xasyncgetresultsize)

## 另请参阅

[游戏存档目录](/build/core-features/common/game-save/game-saves-toc)


## Related topics

- [游戏存档概述](/zh-CN/build/core-features/common/game-save/game-saves-overview.md)
- [游戏存档](/zh-CN/build/core-features/common/game-save/index.md)
- [游戏存档（目录）](/zh-CN/build/core-features/common/game-save/game-saves-toc.md)
- [游戏存档工具](/zh-CN/build/core-features/common/game-save/game-saves-tools.md)
- [游戏存档快速入门](/zh-CN/services/playfab/player-progression/game-saves/quickstart.md)
