Fuchsia 中的跟踪目的是提供一种从 Fuchsia 用户空间进程和 Zircon 内核收集、汇总和可视化诊断跟踪信息的方法。
如需详细了解如何在 Fuchsia 中使用跟踪功能,请参阅以下指南:
默认情况下,Fuchsia 中的跟踪功能处于关闭状态。当发生某个事件(例如系统问题或启动调试会话)时,可以在任意时间段内开启跟踪功能。您不仅可以开启或关闭轨迹,还可以单独选择特定的轨迹类别。
Fuchsia 跟踪系统的各个部分
轨迹提供程序
当您编写用于创建跟踪数据的组件时,该组件会成为跟踪提供程序。一个系统可以有多个跟踪记录提供程序。
Fuchsia 为其跟踪系统采用分布式实现,可让轨迹提供程序将跟踪数据直接写入 Zircon 虚拟内存对象 (VMO)(即共享内存段)。轨迹数据会在生成时存储在内存中,而不会复制到任何其他位置。如需详细了解 VMO,请参阅虚拟内存对象。
在代码中指定轨迹语句时,您可以通过类别来控制要记录的跟踪数据。然后,当您运行跟踪客户端并指定特定类别时,跟踪客户端只会记录来自跟踪提供程序的指定类别。
可跟踪或可向系统提供跟踪信息的组件应实现 TraceProvider
FIDL 协议,并向 Registry
注册轨迹提供程序。注册后,每当开始或停止跟踪时,轨迹提供程序都会收到消息,并且有机会提供采用 Fuchsia 轨迹格式编码的轨迹数据。请参阅 fuchsia.tracing.provider
。
跟踪提供程序(被跟踪的组件)仅写入跟踪缓冲区。如果在轨迹运行期间轨迹提供程序的轨迹缓冲区已满,缓冲模式会决定轨迹提供程序的行为。如需详细了解缓冲模式,请参阅跟踪提供程序缓冲模式。
Trace 客户端
轨迹客户端是用于处理轨迹提供程序生成的数据的组件。系统可以有多个轨迹提供程序和轨迹客户端。跟踪客户端会与跟踪管理器联系,请求启动或停止跟踪。跟踪客户端还可以请求保存收集的跟踪数据。跟踪管理器会收集数据,并通过套接字将其发送到跟踪客户端。
轨迹客户端无法直接影响轨迹提供程序的运行。 在 Fuchsia 跟踪系统中,跟踪提供程序会将数据写入 VMO,然后跟踪管理器会从 VMO 读取数据,最后跟踪客户端会从套接字读取跟踪数据。
Fuchsia 使用单个轨迹客户端,该客户端由以下实用程序组成:
trace
:此实用程序在 Fuchsia 目标上运行。trace
可控制跟踪、向跟踪管理器发送命令以启动和停止跟踪,还可以收集跟踪数据。它还支持将 Fuchsia 轨迹归档转换为其他格式,例如 Catapult JSON 记录。ffx trace
:此实用程序在开发主机上运行。ffx trace
与trace
实用程序通信。然后,可以将轨迹数据作为输出文件从trace
流式传输到开发主机。
您可以直接使用 Controller
FIDL 协议收集轨迹信息。请参阅 fuchsia.tracing.controller
。
轨迹管理器
轨迹管理器是一种系统服务,用于协调轨迹提供程序的注册,并定位每个轨迹提供程序中的数据。Fuchsia 中只有一个轨迹管理器。它可确保跟踪有序进行,并将提供跟踪提供程序的组件与跟踪客户端隔离。跟踪管理器会为每个已注册的跟踪提供程序分配一个 VMO。
跟踪管理器实现以下 FIDL 协议:
Controller
:让跟踪客户端能够枚举跟踪提供程序并收集跟踪数据。请参阅fuchsia.tracing.controller
。Registry
:为轨迹提供程序提供在运行时注册自己的功能,以便跟踪系统可以发现它们。请参阅注册表。
先进先出 (FIFO) 方法会通知轨迹管理器轨迹提供程序的启动和关闭。FIFO 句柄会在初始启动跟踪请求的过程中从跟踪管理器传递给每个跟踪提供程序。如需详细了解 Fuchsia 跟踪系统使用的 FIFO 数据包,请参阅 FIFO 数据包。
跨进程通信
以下是 Fuchsia 跟踪的跨进程通信的重要特征:
- 除了开始或停止收集之外,轨迹提供程序和轨迹管理器没有其他同步点。
- 轨迹提供程序(跟踪的组件)只会写入轨迹缓冲区,而不会从缓冲区中读取数据。
- 轨迹管理器只会从轨迹缓冲区读取数据,而不会向其中写入数据。
- 跟踪客户端通过套接字从跟踪管理器接收跟踪归档文件,并且绝不会读取原始跟踪缓冲区。这样可以防止轨迹客户端操纵轨迹提供程序。
当您启动跟踪时,跟踪管理器会要求所有相关的跟踪提供程序开始跟踪,并为每个提供程序提供一个跟踪缓冲区 VMO,它们应向其写入跟踪记录。在轨迹运行时,轨迹管理器会监控新注册的轨迹提供程序,并根据需要激活它们。
跟踪完成后,跟踪管理器会使所有处于活跃状态的跟踪提供程序停止跟踪。然后,跟踪管理器会等待每个跟踪提供程序确认已写入其跟踪事件。然后,轨迹管理器会读取并验证写入轨迹缓冲区 VMO 的轨迹数据,并创建轨迹归档。
即使跟踪提供程序异常终止,跟踪管理器通常也能恢复部分数据,前提是这些提供程序设法将部分数据存储到其跟踪缓冲区中。如果跟踪提供程序的跟踪缓冲区在跟踪运行时已满,则缓冲模式会决定跟踪提供程序的行为。如需了解详情,请参阅跟踪提供程序缓冲模式。
轨迹管理器通过套接字将生成的轨迹归档文件传送给其客户端。这些数据是根据 Fuchsia 轨迹格式形成的,但如果轨迹提供程序故意发出垃圾数据,则可能包含无意义的数据。
图 1 显示了 Fuchsia 跟踪系统的组件以及这些组件之间的通信方式。
图 1. Fuchsia 跟踪系统