概览
fidlcat 是一款可让用户监控 FIDL 连接的工具。目前,它可以附加到或启动 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>
如果您的代码由 runner 执行,您可能需要附加到 runner。对于 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
您还可以指定一个与 build 已知的唯一网址匹配的 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)可以一起使用。不过,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=pretty 这是默认输出。会话以彩色格式打印。
--format=json 会话以 JSON 格式输出。
--format=textproto 会话以文本 protobuf 格式输出。
--format=summary 在会话结束时显示会话摘要。
--format= 标准输出上不显示任何内容(此选项仅在与 --to=<path> 搭配使用时才有意义)。如果没有输出,fidlcat 会快得多(如果您想监控实时组件,最好使用此选项)。
问题排查
如果您在运行 ffx debug fidl 时遇到问题,请参阅 zxdb 问题排查指南。
fidlcat 工具需要两个信息来源才能正常运行。如果缺少其中任何一个,您将无法解码 FIDL 消息:
首先,它需要可执行文件的符号。实际上,如果您在树内运行,符号应会自动提供给 fidlcat。否则,您可以向 fidlcat 提供:a) 使用
--build-id-dir标志的.build-id目录;b) 使用--ids-txt标志的ids.txt文件;或 c) 使用--symbol-path标志的任意 ELF 文件或 ELF 文件目录。这些标志可以组合使用,也可以多次指定。其次,它需要所提取 FIDL 的中间表示形式,以便生成可读的输出。如果您在树内运行,系统应会自动将 IR 提供给 fidlcat。否则,您可以为 fidlcat 提供 IR 路径,该路径可以是明确的 IR 文件路径、它将扫描的包含 IR 文件的目录,也可以是包含明确路径的实参文件。可以使用
--fidl-ir-path标志将此信息提供给 fidlcat。实参文件需要以@字符开头:--fidl-ir-path @argfile。
如有其他疑虑,开发者可以提交 bug。使用 Tools>fidlcat 组件。
阅读指南
fidlcat 指南介绍了所有可修改输出的标志。它还提供了一些显示解读示例。
代码在哪里?
代码位于 //tools/fidlcat 中。