排查 zx_err_peer_closed 问题

错误 zx_err_peer_closed 表示尝试从对等互连的 Zircon 对象执行读取或写入操作失败。通常,这意味着对等端的远程端已关闭。许多不同类型的 Zircon 对象都可能会发生这种情况,包括:

  • 频道
  • 套接字
  • FIFO

未能向对等互连的对象发出信号(例如 zx_object_signal_peer)时,也可能会出现此错误。

本文档可帮助您排查导致 zx_err_peer_closed 错误的以下原因。

错误原因

以下是导致 zx_err_peer_closed 错误的潜在原因。

不兼容的 FIDL 协议

如果在客户端和服务器之间使用不兼容的 FIDL 协议并导致连接关闭,则会抛出 zx_err_peer_closed 错误。

如需解决此问题,请确保您的客户端和服务器使用相同的 FIDL 协议。如需详细了解 FIDL 协议,请参阅 FIDL 语言规范

请求的协议未在组件清单中定义

与不兼容的 FIDL 协议类似,如果组件清单中未定义请求的协议,您会收到 zx_err_peer_closed 错误。

确保您的清单文件包含您要请求的协议。您可以使用 fidlcat 帮助诊断缺少的协议。

如需了解详情,请参阅:

无法访问请求的文件

如果未能打开文件,系统会抛出 zx_err_peer_closed 错误。以下原因可能会导致此问题:

  • 您正尝试打开的文件不存在
  • 您正在尝试打开的文件请求的权限过多。

在这种情况下,请验证您请求的是现有文件,或者该文件和目录是否具有适当的权限。您可以详细了解目录权限及其指定方式

对等方崩溃了,该进程已终止

如果对等设备崩溃,系统会处理崩溃并终止生成错误的进程以及所有关联对象,从而导致出现 zx_err_peer_closed 错误。

您可以查看日志,确认对等方是否已崩溃。在这种情况下,您可以使用 Just in Time Debugger 调试对等方,以查找崩溃的根源,然后重试该操作。

以组件作者身份向错误添加标志

作为组件作者,当用户看到 zx_err_peer_closed 错误时,请务必帮助用户获取更多有意义的错误消息。为此,您的代码应使用 binding::Close(zx_status_t epitaph_value) 绑定设置 epitaph。