Fuchsia 跟踪系统

Fuchsia 中跟踪的目的是提供一种手段,用于从 Fuchsia 用户空间进程和 Zircon 内核收集、汇总和可视化诊断跟踪信息。

如需详细了解如何在 Fuchsia 中使用跟踪,请参阅以下指南:

默认情况下,Fuchsia 中的跟踪功能处于关闭状态。当发生事件(例如系统问题或调试会话启动)时,可以开启跟踪功能任意时长。不仅可以开启或关闭跟踪,还可以单独选择特定的跟踪类别。

Fuchsia 跟踪系统的各个部分

在 Fuchsia 跟踪系统中,以下组件以分布式方式运行

Trace 提供程序

当您编写一个创建跟踪数据的组件时,该组件会成为跟踪提供程序。一个系统可以有多个轨迹提供程序。

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

Trace 管理器

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

轨迹管理器实现了以下 FIDL 协议:

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

先进先出 (FIFO) 方法会通知轨迹管理器轨迹提供程序的启动和关闭。FIFO 句柄会作为初始启动跟踪请求的一部分从跟踪管理器传递给每个跟踪提供程序。

跨进程通信

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

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

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

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

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

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

图 1 显示了 Fuchsia 跟踪系统的各个组件以及这些组件之间的通信方式。

此图显示了 Fuchsia 跟踪系统。

图 1. Fuchsia 跟踪系统