ffx trace 命令可以记录来自 Fuchsia 设备的诊断跟踪数据。这些数据可用于衡量和调试性能问题、了解线程、进程和组件之间的互动,以及直观呈现整个系统。
添加 Fuchsia 轨迹事件
如需查看有关向代码添加 Fuchsia 跟踪功能的完整端到端指南,请参阅 Fuchsia 跟踪教程。
概念
Fuchsia 跟踪系统提供了一种机制,用于从 Fuchsia 设备上的用户空间进程和 Zircon 内核收集、汇总和直观呈现诊断跟踪信息。跟踪系统由跟踪管理器、内存缓冲区和一个或多个跟踪提供程序组成。轨迹提供程序是一种在设备上生成轨迹数据的组件,一个系统可以有多个轨迹提供程序。(如需将组件注册为轨迹提供程序,请参阅注册轨迹提供程序。)
ffx trace start 命令会将跟踪输出存储为宿主机上的 .fxt 文件。您可以在 Perfetto 查看器中打开此文件,直观呈现轨迹结果以进行性能分析。(如需详细了解 Perfetto,请参阅此 Perfetto 文档网站。)
默认情况下,ffx trace start 命令会尝试从一组预定义的跟踪类别中收集跟踪数据(运行 ffx trace start --help 可查看默认类别)。不过,ffx trace start 还允许您选择跟踪类别来收集跟踪数据。
在 Fuchsia 设备上,一次只能运行一个跟踪会话,并且只能将单个轨迹记录到输出文件中。在以下示例中,所有输出文件默认位于运行 ffx trace 的目录中,且默认名称为 trace.fxt;所有目标设备默认都是当时连接到宿主计算机的可用 Fuchsia 设备。
以交互方式运行轨迹
借助交互式轨迹,您可以按 Enter 键实时决定何时结束轨迹记录。不过,如果指定了 --duration 标志,则在达到相应时长时,跟踪会自动停止。(如需详细了解在运行轨迹记录时结果如何存储在缓冲区中,请参阅附录中的缓冲模式选项。)
如需启动互动轨迹,请运行以下命令:
ffx trace start此命令会显示类似于以下内容的输出:
$ ffx trace start
Tracing started successfully on "fuchsia-5254-0063-5e7a".
Writing to /Users/alice/trace.fxt
Press <enter> to stop trace.
如需停止跟踪,请按 Enter 键。
该命令会退出,并输出类似如下内容:
Shutting down recording and writing to file.
Tracing stopped successfully on "fuchsia-5254-0063-5e7a".
Results written to /Users/alice/trace.fxt
Upload to https://ui.perfetto.dev/#!/ to view.
如需分析从本次运行中收集的结果,请参阅直观呈现轨迹结果。
在后台运行轨迹
只要未指定时长,后台轨迹就会无限期运行。如需停止在后台运行的轨迹,您需要运行 ffx trace stop。(如需详细了解在跟踪运行时结果如何存储在缓冲区中,请参阅附录中的缓冲模式选项。)
如需开始后台轨迹,请运行以下命令:
ffx trace start --background此命令会显示类似于以下内容的输出:
$ ffx trace start --background
Tracing started successfully on "fuchsia-5254-0063-5e7a".
Writing to /Users/alice/trace.fxt
Current tracing status:
- fuchsia-5254-0063-5e7a:
- Output file: /Users/alice/trace.fxt
- Duration: indefinite
- Config:
- Categories:
- app,audio,benchmark,blobfs,gfx,input,kernel:meta
如需停止此跟踪,请参阅停止跟踪。
在后台运行带计时器的轨迹
与交互式轨迹类似,您可以在后台运行轨迹记录,并将其设置为在特定时间段后停止。
如需启动带计时器的后台轨迹,请运行以下命令:
ffx trace start --background --duration <SECONDS>将 SECONDS 替换为目标时长(以秒为单位),例如:
$ ffx trace start --background --duration 20
如需手动停止此跟踪,请参阅停止跟踪。
在后台运行带触发器的轨迹
如果使用触发器运行轨迹,则在检测到指定事件时,轨迹会停止。
如需运行带有触发器的轨迹,请运行以下命令:
ffx trace start --background --trigger <TRIGGER>将 TRIGGER 替换为使用 alert:action 语法的操作,例如:
$ ffx trace start --background --trigger "myexample:terminate"
如需手动停止此跟踪,请参阅停止跟踪。
在后台检查轨迹的状态
如需检查后台轨迹的状态,请运行以下命令:
ffx trace status此命令会显示类似于以下内容的输出:
$ ffx trace status
- fuchsia-5254-0063-5e7a:
- Output file: /Users/alice/trace.fxt
- Duration: indefinite
- Config:
- Categories:
- app,audio,benchmark,blobfs,gfx,input,kernel:meta
如果后台没有轨迹,该命令会输出以下内容:
$ ffx trace status
No active traces running.
停止跟踪
ffx trace stop 命令会停止在后台运行的轨迹。
如需停止轨迹,请运行以下命令:
ffx trace stop [--output <FILE>]默认情况下,该命令会停止与默认目标设备匹配的轨迹。不过,您也可以使用 –output 标志选择要停止的轨迹,然后停止与输出文件关联的轨迹。
此命令会显示类似于以下内容的输出:
$ ffx trace stop
Tracing stopped successfully on "fuchsia-5254-0063-5e7a".
Results written to /Users/alice/trace.fxt
Upload to https://ui.perfetto.dev/#!/ to view.
如需分析从本次运行中收集的结果,请参阅直观呈现轨迹结果。
直观呈现轨迹结果
跟踪结束后,系统会创建 .fxt 文件。在 Perfetto 查看器中打开该文件,即可直观呈现跟踪结果。
请执行以下操作:
- 在网络浏览器中访问 Perfetto 查看器网站。
- 点击导航栏中的打开轨迹文件。
- 从主机中选择
trace.fxt文件。
符号化 FIDL 轨迹
如果收集的轨迹包含 kernel:ipc 类别,则 .fxt 轨迹文件将包含许多与轨迹持续时间内进行的 FIDL 调用相对应的 Channel 消息事件。这些渠道消息将仅包含与 FIDL 调用关联的序号,该序号是所调用方法的 SHA-256 哈希。
Fuchsia build 目录包含名称以 .fidl.json 结尾的文件。这些文件包含将序数转换为相应 FIDL 方法所需的信息,并且是在 Fuchsia build 期间生成的。只要有 Fuchsia build 目录,这些文件就可用于将轨迹文件中的序号符号化为相应的 FIDL 方法
如需翻译轨迹文件中的所有序号,请使用以下命令:
ffx trace symbolize --fxt <FXT-FILE> [--outfile <OUTFILE>] [--ir-path <ir-path...>]将 FXT-FILE 替换为轨迹文件的路径。默认情况下,符号化后,原始轨迹文件中的轨迹会被覆盖。指定 OUTFILE 实参会导致跟踪记录写入指定的文件。
ir-path 实参可用于提供要用于符号化的特定 IR 文件。这样一来,即使没有 Fuchsia build 目录,也可以使用提供的 IR 文件执行符号化。
您还可以使用以下命令为各个序数添加符号:
ffx trace symbolize [--ordinal <ordinal>] [--ir-path <ir-path...>]查看跟踪类别
借助 ffx trace start 命令,您可以选择用于收集轨迹数据的类别,例如:
$ ffx trace start --categories "kernel,kernel:arch"
如需查看 Fuchsia 设备上的所有可用轨迹类别,请运行以下命令:
ffx trace list-categories此命令会显示类似于以下内容的输出:
$ ffx trace list-categories
Known Categories:
- app - Generic application traces
- benchmark - Benchmark traces
- cpu - several, run xyz for the list
- gfx - Graphics & Compositor
- input - Input system
- kernel - All kernel trace events
- kernel:arch - Kernel arch events
Default Categories:
- app
- audio
- benchmark
- blobfs
如需详细了解类别,请参阅附录中的类别和类别组。
查看跟踪记录提供程序
如需查看 Fuchsia 设备上的所有可用轨迹提供程序,请运行以下命令:
ffx trace list-providers此命令会显示类似于以下内容的输出:
$ ffx trace list-providers
Trace providers:
- ktrace_provider
其他跟踪指南
如需获取有关在 Fuchsia 中使用跟踪功能的更多指南,请参阅 Fuchsia 跟踪指南。
附录
类别和类别组
ffx trace start 命令支持特殊语法,可更精确地控制启用或停用特定类别:
尾随星号 (
*) 会执行前缀匹配。例如,
kernel*会启用kernel:meta, kernel:sched。斜杠 (
/) 可将类别限制为特定轨迹提供方。例如,
archivist.cm/packet仅为archivist轨迹提供程序启用数据包类别。
ffx trace start 还支持类别组,即以 # 前缀表示的预定义类别列表。例如,#chrome_nav(展开后为 loading、net、netlog、navigation 和 browser)用于指定与资源加载和网页导航相关的所有事件,而 #default 表示一组默认类别。
运行 ffx trace start 时,可以指定类别组以及类别。例如,以下命令会启用所有默认类别和 my_cat 类别:
$ ffx trace start --categories '#default,my_cat'
如需查看主机上的完整类别组列表,请运行以下命令:
ffx config get -s all trace.category_groups您可以使用 ffx config set 命令设置自定义类别组。
如果您想为一组常用类别定义自定义类别组,请运行类似于以下内容的命令:
$ ffx config set trace.category_groups.audiovisual '["audio", "gfx"]'
上述示例命令定义了一个名为 #audiovisual 的新自定义类别组。
Chrome 和 WebEngine 类别组
Chrome 特定的类别组可用于从 Chrome 和 WebEngine 收集轨迹信息。
以下是 Chrome 类别组的列表:
#chrome_input:输入处理事件。#chrome_ipc_flows:Mojo IPC 路由事件。#chrome_js_exec:JavaScript (V8) 事件。#chrome_nav:资源加载、网页导航和浏览器事件。#chrome_task_sched:异步任务调度和分派事件。#chrome_ui_render:Chrome 界面事件(浏览器用户体验、浏览器 widget、合成器和 GPU)。#chrome_web_content_render:内容渲染事件(Blink、合成器和 GPU)。
所有 Chrome 类别组都包含 toplevel 和 toplevel.flow 类别,这些类别涵盖各种基本的 Chrome 事件,例如异步任务调度。
指定类别时,您可以将 Chrome 类别与 Fuchsia 类别结合使用。例如,以下命令会收集 Chrome 内容渲染的轨迹数据以及 Zircon 内核调度器活动:
$ ffx trace start --categories kernel:sched,#chrome_web_content_render
缓冲模式选项
借助 --buffering-mode 标志,您可以决定缓冲区填满时会发生什么情况。
具体选项包括:
oneshot:写入缓冲区,直到缓冲区已满,然后忽略所有其他跟踪事件。(这是默认选项。)circular:写入缓冲区,直到缓冲区已满,然后用新事件替换旧事件。streaming:在跟踪事件到达时将其转发到跟踪管理器。streaming选项可提供额外的缓冲区空间,但由于偶尔需要通过 IPC 将事件发送到轨迹管理器,因此会产生一些开销。对于捕获大型轨迹,通常建议使用此模式,而不是使用非常大的缓冲区。
以下命令运行一个具有 32 MB 缓冲区的轨迹,该缓冲区会用新事件覆盖旧事件:
$ ffx trace start --buffer-size 32 --buffering-mode circular
与交互模式类似,按 Enter 键可停止轨迹。
以下命令会使用缓冲区中的新事件覆盖旧事件,并在发生事件时停止轨迹:
$ ffx trace start --buffer-size 32 --buffering-mode circular --trigger 'myexample:terminate'
如需使上述命令正常运行,必须先设置已跟踪的代码以触发相应事件。