本文档介绍了如何为 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
}
大多数宏的前两个参数是跟踪记录类别和事件名称。在此示例中,它们分别为 example
和 DoSomething
。
通过跟踪类别,您可以指定跟踪系统收集的数据类型。如果未请求类别,系统将不会收集任何数据。类别不必在司机中是唯一的。一个通常可以将多个事件划分到同一类别下。
事件名称包含在跟踪记录中,用于描述事件。它通常对于每个事件都是唯一的。
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 设备上进行跟踪的说明,请参阅记录跟踪记录以进行性能分析。
深入阅读
如需了解详情,请参阅紫红色跟踪指南。