fidlcat:监控和调试 fidl 调用

概览

fidlcat 是一种允许用户监控 FIDL 连接的工具。目前, 可附加到 Fuchsia 设备上或在 Fuchsia 设备上启动进程,并报告其 FIDL 流量。

启用

fidlcat 工具包含在 SDK 中。在 fuchsia.git 中,调用 fx build 会自动构建。

如需运行 fidlcat,必须在 Fuchsia 目标上启用网络。要启动 模拟器。按照说明启动模拟器 可以访问 FEMU 上的外部网络 页面

运行

当您的环境设置正确,并且已构建 Fillcat 之后,您应该 能够用它来监控目标进程中的 FIDL 消息。还有 实现这一目标的方法也有很多种。请注意,必须通过 ffx debug fidl 命令调用 fidlcat,该命令会自动设置网络隧道并查找一些 必备工件(例如调试符号)。

附加到正在运行的进程

如果您在 shell 中运行 ps 命令,则可以获取要监控的 pid, 并运行:

ffx debug fidl --remote-pid <pid>

如果您的代码由运行程序执行,您可能需要将代码附加到 。对于 Dart JIT 执行的代码,请在目标上运行 ps,并查找名为 dart_jit_runner 的进程:

host$ fx shell ps
[...]
        j:21102           17.6M   17.6M
          p:21107         17.6M   17.6M     32k         dart_jit_runner.cm

然后,您可以直接附加到该进程,并查看 Dart 程序:

host$ ffx debug fidl --remote-pid 21107

您可以多次使用 --remote-pid 标志以连接到多个进程:

ffx debug fidl --remote-pid <pid1> --remote-pid <pid2>

使用 fidlcat 启动组件

或者,您可以直接使用组件的网址启动组件:

ffx debug fidl -- run fuchsia-pkg://fuchsia.com/echo_client_rust#meta/echo_client_rust.cm

您还可以使用与构建已知的唯一网址匹配的 bash 正则表达式指定网址:

ffx debug fidl -- run "echo_client_cpp_synchronous.*"
ffx debug fidl -- run echo_client_cpp.cm

启动时附加到程序

您还可以通过将正则表达式传递给 与其名称相符Fidlcat 将会连接到所有当前正在运行的 随后启动了与正则表达式匹配的程序。如果您发出以下 那么 fidlcat 就会连接到系统,然后连接到所有带有 子字符串“echo_client”。

ffx debug fidl --remote-name echo_client

商住两用

--remote-pid、--remote-name 和 run 这三个选项可以结合使用。 但是,运行必须始终是最后运行。

当 --remote-name 和 run 一起使用时,只有匹配的进程 --remote-name 受到监控。

示例(echo_server 由 echo_client 启动):

运行并监控 echo_client。 sh ffx debug fidl -- run echo_client_cpp.cm

运行并监控 echo_client。 sh ffx debug fidl --remote-name echo_client -- run echo_client_cpp.cm

运行 echo_client 并监控 echo_server。 sh ffx debug fidl --remote-name echo_server -- run echo_client_cpp.cm

运行 echo_client 并监控 echo_client 和 echo_server。 sh ffx debug fidl --remote-name echo -- run echo_client_cpp.cm

运行 echo_client 并监控 echo_client 和 echo_server。 sh ffx debug fidl --remote-name echo_client --remote-name echo_server -- run echo_client_cpp.cm

监控服务

如果要监控某项服务,您应使用 --extra-name 而不是 --remote-name。选项 --extra-name 还会监控一些进程。不过,对于这些进程 其中某个“--remote-name”启动了另外,演奏到最后一段时 &quot;--remote-name&quot;进程停止(即使某些“--extra-name”进程仍然受到监控)。

ffx debug fidl --remote-name echo --extra-name archivist -- run echo_client_cpp.cm

输入选项

有两种输入选项:

  • --from=device 这是默认选项,用于实时监控设备。

  • --from=&lt;path&gt;播放。使用此选项后,fidlcat 会重放之前使用 --to=&lt;path&gt;(protobuf 格式)。

会话保存

--to=<path> 选项会话会保存到指定的文件(二进制 protobuf 格式)。 保存会话后,您可以使用“--from=<path>”重放会话。系统会保存原始数据。 也就是说,保存的数据与显示的数据无关。

格式(输出)选项

输出选项如下:

  • --format=pretty 这是默认输出。会话的打印效果非常好(带有颜色)。

  • --format=json 使用 json 格式输出该会话。

  • --format=textproto 会话使用文本 protobuf 格式输出。

  • --format=summary 在会话结束时,会显示会话的摘要。

  • --format= 在标准输出中不显示任何内容(此选项仅在使用 替换为 --to=<path>)。在没有输出时,fidlcat 的速度会快得多(当您 监控实时组件)。

问题排查

如果您在运行 ffx debug fidl 时遇到问题,请参阅问题排查指南 适用于 zxdb

fidlcat 工具需要两个信息来源才能正常运行。如果其中任一功能 您将无法解码 Fidl 消息:

  • 首先,它需要可执行文件的符号。实际上,如果您 在树内运行时,这些符号应自动提供给 fidlcat。 否则,您可以使用 .build-id --build-id-dir 标志;b) 使用 --ids-txt 标志的 ids.txt 文件;或 c) 使用 --symbol-path 创建任意 ELF 文件或 ELF 文件目录 标志。这些标志可以组合并指定多次。

  • 其次,它需要所提取 FIDL 的中间表示法。 它可以生成可读输出。如果您在树内运行,IR 应该为 自动提供给 fidlcat。或者,您也可以为设备提供红外线 路径,可以是明确的 IR 文件路径,以及为 IR 扫描的目录 文件或包含显式路径的参数文件。可以提供 使用 --fidl-ir-path 标志进行 fidlcat。参数文件必须为 前带有 @ 字符:--fidl-ir-path @argfile

有其他顾虑的开发者可以提交 bug。使用“Tools”>“fidlcat” 组件。

阅读指南

fidlcat 指南介绍了用于修改 输出。此外,还提供了一些展示广告解读示例。

代码在哪里?

代码位于 //tools/fidlcat 中。