录制启动跟踪记录

Zircon 内核的内部跟踪系统可在启动时处于活跃状态。这意味着,通过设置启动选项,至少可以跟踪启动的内核端。启动完成后,数据就已经存在,只需收集这些数据即可。

启用内核跟踪启动参数

在启动时可以使用 ktrace.bufsize=N 命令行选项更改内核的跟踪缓冲区大小,其中 N 是缓冲区的大小(以兆字节为单位)。

具体选择收集哪些数据由“ktrace.grpmask=0xNNN”命令行选项控制。0xNNN 值是来自 //zircon/kernel/lib/boot-options/include/lib/boot-options/options.inc 的 KTRACE_GRP_* 值的位掩码。默认值为 0x000,表示停用所有轨迹类别(或 ktrace 参数中的组)。

通过 fx set 命令将启动选项设置为 GN 变量:

fx set ... --args='dev_kernel_cmdline=["ktrace.grpmask=0xFFF"]'

然后,您需要重新构建并重新部署。

如需详细了解 Zircon 命令行选项,请参阅: - kernel_cmdline - kernel_build

在轨迹结果中包含内核启动轨迹数据

启用内核跟踪启动参数后,只要内核的内部轨迹缓冲区未倒回,启动后数据就可包含在轨迹中。这可通过将类别 kernel:retain 传递给 ffx tracetrace 程序来实现。请注意,如果在未传递 kernel:retain 的情况下进行跟踪,则 ktrace 缓冲区会后退,数据会丢失。

示例:

ffx trace start --categories "kernel,kernel:retain" --buffer-size 32 --duration 1

这里需要注意几点重要事项。

首先要注意的是传递的类别:kernelkernel:retainkernel 类别会指示内核跟踪所有内容。 在此示例中,内核已经在跟踪一切:这是启动时的默认跟踪。此处指定了一种简单的方法,用于告知 ktrace_provider( Fuchsia 跟踪系统和内核之间的接口)正在收集内核数据。kernel:retain 类别用于指示 ktrace_provider 在跟踪开始时不要回退内核跟踪缓冲区。

第二个是缓冲区空间。内核的默认轨迹缓冲区大小为 32MB,而 Fuchsia 轨迹默认缓冲区大小为 4MB。 使用较大的 Fuchsia 跟踪缓冲区空间意味着有足够的空间来存放内核跟踪缓冲区的内容。

需要注意的第三个重要事项是,在此示例中,我们只想获取跟踪缓冲区的当前内容,而不想再跟踪任何其他内容。因此,使用 1 秒的时长。