Fuchsia 跟踪系统

在 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 tracetrace 实用程序通信。然后,跟踪数据可以作为输出文件从 trace 流式传输到开发主机。

您可以使用 Controller FIDL 协议直接收集轨迹信息。请参阅 fuchsia.tracing.controller

跟踪管理器

轨迹管理器是一项系统服务,用于协调轨迹提供程序的注册并定位每个轨迹提供程序的数据。Fuchsia 中只有一个跟踪管理器。它可确保跟踪按顺序进行,并将提供轨迹提供程序的组件与跟踪客户端隔离开来。跟踪管理器会为每个已注册的跟踪记录提供程序分配一个 VMO。

跟踪管理器实现以下 FIDL 协议:

  • Controller:为跟踪客户端提供枚举轨迹提供程序和收集轨迹数据的功能。请参阅 fuchsia.tracing.controller
  • Registry:为跟踪记录提供程序提供在运行时自行注册的功能,以便跟踪系统可以发现它们。请参阅注册表

先进先出 (FIFO) 方法会将跟踪记录提供程序的启动和关闭告知跟踪管理器。FIFO 句柄作为初始启动跟踪请求的一部分从轨迹管理器传递到每个轨迹提供程序。如需详细了解 Fuchsia 跟踪系统使用的 FIFO 数据包,请参阅 FIFO 数据包

跨进程通信

以下是 Fuchsia 跟踪跨进程通信的重要特征:

  • 除了开始或停止收集之外,轨迹提供程序和轨迹管理器没有同步点。
  • 跟踪提供程序(跟踪的组件)只会写入跟踪缓冲区,而不会从缓冲区中读取数据。
  • 跟踪管理器只会从跟踪缓冲区读取数据,绝不会向其写入数据。
  • Trace 客户端通过套接字从跟踪管理器接收轨迹归档,并且永远不会读取原始轨迹缓冲区。这样可以保护跟踪记录提供程序免受跟踪记录客户端操纵。

当您启动跟踪时,跟踪管理器会要求所有相关的跟踪提供程序开始跟踪,并向每个提供程序提供一个跟踪缓冲区 VMO,供它们写入其跟踪记录。在轨迹运行时,轨迹管理器会监控新注册的轨迹提供程序并根据需要激活它们。

跟踪完成后,跟踪管理器会使所有活跃的跟踪提供程序停止跟踪。然后,跟踪管理器会等待每个跟踪提供程序确认其已完成写入跟踪事件。然后,轨迹管理器会读取并验证写入轨迹缓冲区 VMO 的轨迹数据,并创建轨迹归档。

即使跟踪提供程序异常终止,只要跟踪管理器设法将一些数据存储在其跟踪缓冲区中,跟踪管理器通常也可以恢复部分数据。如果轨迹提供程序的轨迹缓冲区在轨迹运行期间填满,缓冲模式将决定轨迹提供程序的行为。如需了解详情,请参阅跟踪提供程序缓冲模式

轨迹管理器通过套接字将生成的轨迹归档传输到其客户端。此数据根据 Fuchsia 轨迹格式形成,但如果轨迹提供程序故意发出垃圾数据,则它可能包含无意义的数据。

图 1 显示了 Fuchsia 跟踪系统的组件以及组件之间的相互通信方式。

此图显示了 Fuchsia 追踪系统。

图 1. Fuchsia 追踪系统