为驱动程序添加跟踪记录

本文档介绍了如何为 Fuchsia 系统中的驱动程序添加跟踪功能。

概览

如需简要了解跟踪,请参阅紫红色跟踪系统。 不过,驱动程序无需指定跟踪提供程序。驱动程序主机为其驱动程序提供一个。

有关跟踪的教程,请参阅在代码中添加跟踪记录。如需查看跟踪 API 参考文档,请参阅跟踪:C 和 C++ 宏

添加跟踪记录

如需添加对驱动程序的跟踪,您需要更新驱动程序的源代码和 BUILD.gn 文件。

源代码更新

如需在驱动程序组件中添加跟踪记录,请更新源代码以从 lib/trace/event.h 调用 TRACE_*() 宏,例如:

#include <lib/trace/event.h>

void DoSomething(int a, std::string b) {
  TRACE_DURATION("example", "DoSomething", "a", a, "b", b);

  // Do something
}

大多数宏的前两个参数是跟踪记录类别和事件名称。在此示例中,它们分别为 exampleDoSomething

通过跟踪类别,您可以指定跟踪系统收集的数据类型。如果未请求类别,系统将不会收集任何数据。类别不必在司机中是唯一的。一个通常可以将多个事件划分到同一类别下。

事件名称包含在跟踪记录中,用于描述事件。它通常对于每个事件都是唯一的。

BUILD.gn 更新

如需选择跟踪支持,请将以下目标添加到驱动程序的 BUILD.gn 中:

fuchsia_driver("my_driver") {
  deps = [
    ...
    "//zircon/system/ulib/trace",
  ]
}

使用跟踪记录进行构建

为了能够跟踪启动期间加载的驱动程序,请使用其他 --with-base=//bundles/packages/prod:tracing 选项设置 Fuchsia build 配置,例如:

$ fx set workstation_eng.x64 --with-base=//bundles/packages/prod:tracing
$ fx build

如果没有此选项,当驱动程序启动时,TraceManager 将不存在。 因此,TraceManager 之后启动时,驱动程序将无法参与跟踪。

如需详细了解 fx set,请参阅 fx 工作流(或运行 fx help set)。

启动跟踪

Fuchsia 使用内核命令行标志在启动期间在驱动程序中启用跟踪:

driver.tracing.enable=1

这是 Fuchsia 设备中的默认设置。

如需禁止驱动程序参与 Fuchsia 跟踪,请使用以下命令行标志启动内核:

driver.tracing.enable=0

有关启动特定 Fuchsia 设备的说明,请参阅您的硬件或 QEMU 的文档。在启动期间,跟踪不需要任何特殊操作。

使用跟踪记录

使用 ffx trace 记录轨迹,并通过 Perfetto 查看器查看结果。

以下示例命令使用上面源代码更新部分中所述的 example 类别:

$ ffx trace start --categories "example,kernel:sched,kernel:meta"

如果您想直观呈现结果,则需要显示 kernel:sched,kernel:meta 类别。可视化工具想要将轨迹数据与线程和进程相关联,并且需要内核通过这些类别提供的数据。

如需了解更多详情,以及有关如何在不使用 ffx 的情况下直接在 Fuchsia 设备上进行跟踪的说明,请参阅记录跟踪记录以进行性能分析

深入阅读

如需了解详情,请参阅紫红色跟踪指南