fidlcat:监控和调试 fidl 调用

概览

fidlcat 是一款可让用户监控 FIDL 连接的工具。目前,它可以连接到 Fuchsia 设备或在 Fuchsia 设备上启动进程,并报告其 FIDL 流量。

正在启用

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

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

运行

正确设置环境并构建 fidlcat 后,您应该就可以用它来监控来自目标进程的 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 程序发送的所有 FIDL 消息:

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 正则表达式指定该网址,该正则表达式与 build 已知的唯一网址匹配:

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”进程时才会开始监控。此外,当最后一个“--remote-name”进程停止时,fidlcat 也会停止(即使某些“--extra-name”进程仍受到监控)。

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

输入选项

您有两种输入选项:

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

  • --from=<path> 播放。选择此选项后,fidlcat 会重放之前使用 --to=<path>(protobuf 格式)保存的会话。

课程保存

--to=<path> 选项:会话将保存到指定的文件(二进制 protobuf 格式)。 保存会话后,您可以使用“--from=<path>”重放该会话。系统会保存原始数据。 这意味着保存的数据与显示的内容无关。

格式(输出)选项

您可以使用以下输出选项:

  • --format=Interest 这是默认输出。会议打印出来(带有颜色)。

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

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

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

  • --format= 标准输出中不会显示任何内容(此选项只有在与 --to=<path> 搭配使用时才有意义)。如果没有输出,fidlcat 的运行速度会快得多(如果您想监控实时组件,这会更好)。

问题排查

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

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

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

  • 其次,它需要它注入的 FIDL 的中间表示法,以便生成可读输出。如果您在树内运行,应自动向 fidlcat 提供 IR。否则,您可以提供 Filcat IR 路径,该路径可以是显式 IR 文件路径、用于扫描查找 IR 文件的目录,或包含显式路径的参数文件。您可以通过 --fidl-ir-path 标志向 fidlcat 提供此功能。参数文件需要以 @ 字符开头:--fidl-ir-path @argfile

如有其他问题,开发者可以提交 bug。使用“工具”>“fidlcat”组件。

阅读此指南

fidlcat 指南介绍了用于修改输出的所有标志。并提供了一些显示解释的示例。

密码在哪里?

该代码位于 //tools/fidlcat 中。