本文档介绍了用于收集、存储和 传输 Fuchsia 跟踪记录。 您可以使用此文档搜索详细信息 Fuchsia 跟踪记录格式中的每个字段。
概览
当轨迹正在运行时,轨迹提供程序会将记录写入轨迹缓冲区 使用本文件中描述的二进制格式与跟踪管理器共享的 VMO 文档。
二进制格式旨在尽量减少对 写入跟踪记录时,跟踪记录中正文的性能。记录 也会依序写入,因此,如果跟踪记录终止(通常或 跟踪管理器仍然可以恢复部分跟踪数据 通过读取所有内容(直至格式正确的最后一个),存储在跟踪缓冲区中 记录。
随着跟踪的进行,跟踪管理器会汇总来自所有 参与跟踪记录收集和串联的跟踪记录提供程序 与一些特殊的元数据记录一起形成跟踪记录归档。
跟踪完成后,trace
命令行程序等工具
可以读取轨迹归档中的轨迹记录以直观呈现结果
或将其保存到文件中供日后使用
功能
- 体积小
<ph type="x-smartling-placeholder">
- </ph>
- 跟踪记录非常紧凑,会将信息打包到少量位中。
- 将字符串、进程和线程池化可以进一步压缩轨迹数据。
- 内存对齐
<ph type="x-smartling-placeholder">
- </ph>
- 跟踪记录在内存中保持 8 字节对齐,以便于 直接将它们写入内存映射的 VMO
- 大小可变的记录
<ph type="x-smartling-placeholder">
- </ph>
- 总记录大小上限为 32 KB。
- 大型对象可能需要拆分为多条记录。
- 可扩展
<ph type="x-smartling-placeholder">
- </ph>
- 您可以视需要定义新的记录类型。
- 可以跳过无法识别或格式错误的跟踪记录。
对基元进行编码
Fuchsia 跟踪记录格式具有以下编码基元:
Atoms
每条记录都构建为原子序列。
每个 Atom 都采用 8 字节对齐方式进行编写,其大小也是 8 个字节的倍数,以保持对齐。
原子有两种:
- 字:可进一步细分为位字段的 64 位值。 单词按照机器单词顺序存储(目前所有单词 支持的架构)。
- 数据流:用零填充到下一个 8 个字节的字节序列 边界。流按字节顺序存储。视频流是 8 个字节长的倍数不填充(没有零终止符)。
“Fields”是 64 位 Words 的子类,以
[<least significant bit> .. <most significant bit>]
,其中第一个和
最后位的位置包括在内。所有未使用的位均预留以供日后使用
且必须设为 0。
除非另有说明,否则字词和字段会存储无符号整数 取决于记录格式。
数据流可以存储 UTF-8 字符串或二进制数据,具体由 记录格式。
记录
跟踪记录是一种二进制编码的跟踪记录信息,由 原子序列。
所有记录均包含标头字词,其中包含以下基本信息: 信息:
- 记录类型:用于标识记录类型的 4 位字段 及其包含的信息请参阅记录类型。
- 记录大小:通常是一个 12 位字段,表示字数 (8 字节单位的倍数),包括该记录 标头本身。记录最多可包含 4095 个字词 (32760 字节)。非常简单的记录可能只有 1 个字(8 个字节)。 大型记录使用 32 位大小字段,因此具有更高的 大小上限。
记录的长度始终是 8 个字节的倍数,与 8 字节对齐。
存档
轨迹归档是一系列以端到端的方式串联起来的 用于存储跟踪记录提供程序在更新日志期间 与用于标识和分隔各个部分的元数据记录一起运行 每个跟踪记录提供程序生成的跟踪记录。
跟踪记录归档旨在按顺序读取,因为 出现在跟踪记录的前面部分可能会影响记录的解释 稍后在跟踪记录中显示跟踪系统提供了 从跟踪记录归档中提取信息并将其转换为 直观呈现数据
时间戳
时间戳表示为来自硬件计数器的 64 位基点。 轨迹初始化记录描述了每秒的 tick 数 实时更新。
默认情况下,我们假设 1 个基点等于 1 纳秒。
字符串引用
字符串被编码为字符串引用,这是 以下表单:
- 空字符串:值为零。
- 编入索引的字符串:最高有效位为零。低 15 位 表示字符串表中之前使用 字符串记录。
- 内嵌字符串:最高有效位为 1。低 15 位 表示字符串的长度(以字节为单位)。该字符串的内容即会显示 内嵌在记录格式指定的记录的其他部分。
为了使跟踪记录更紧凑、经常引用的字符串,例如 event 类别和名称常量,应注册到字符串表中 使用字符串记录,然后通过索引引用。
字符串表中最多只能包含 32,767 个字符串。如果此限制为 可以通过替换现有条目来编码其他字符串 也可以对字符串进行内联编码
字符串内容本身以 UTF-8 流形式存储,且无终止。
字符串的理论最大长度为 32,767 个字节,但实际上 存储记录的其余部分所需的空间将进一步减少 因此我们将字符串长度上限设为一个保守的 32000 字节。
线程引用
线程和进程内核对象 ID (koids) 会编码为线程引用 它们是以下形式的 8 位值:
- 内嵌线程:值为零。此时屏幕上会显示线程和进程 Kid 内嵌在记录格式指定的记录的其他部分。
- 编入索引的线程:值为非零值。值表示 之前使用线程记录分配的线程表。
为了使跟踪记录更紧凑,应注册经常引用的线程 使用线程记录插入线程表,然后通过索引引用。
字符串表中最多可以有 255 个线程。如果此限制为 可以通过替换现有条目来编码其他线程 或对线程进行内联编码
用户空间对象信息
跟踪可以包含关于用户空间对象(任何 (在 用户空间对象记录的形式。Trace 提供程序通常会生成 此类记录。
此后,引用同一指针的任何指针参数都将 与参照的注释相关联。
这样可以轻松地将人类可读的标签和其他信息 稍后在跟踪记录中显示的对象相关联。
内核对象信息
跟踪记录可以包含关于内核对象(任何 使用 Zircon Kid 引用,例如进程、渠道或事件) 内核对象记录的形式。Trace 提供程序通常会生成 在对象创建完毕后记录。
此后,引用同一 koid 的任何内核对象 Id 参数将变为 与参照的注释相关联。
这样可以轻松地将人类可读的标签和其他信息 稍后在跟踪记录中显示的对象相关联。
特别是,跟踪系统就是通过这种方式将名称与进程关联起来 和线程库。
参数
参数是类型化的键值对。
许多记录类型最多允许向记录附加 15 个参数, 提供来自开发者的更多信息。
与普通记录一样,参数带有大小前缀,因此 参数类型可以跳过。
如需了解详情,请参阅参数类型。
扩展格式
跟踪记录格式可以通过以下方式进行扩展:
- 定义新的记录类型。
- 在现有记录类型的预留字段中存储新信息。
- 将新信息附加到现有记录类型(此 则可通过检查记录的大小和负载来检测该信息)。
- 定义新的参数类型。
记录类型
记录类型如下:
- 记录标头
- 大型记录标头
- 元数据记录(记录类型 = 0)
- 初始化记录(记录类型 = 1)
- 字符串记录(记录类型 = 2)
- 线程记录(记录类型 = 3)
- 事件记录(记录类型 = 4)
- Blob 记录(记录类型 = 5)
- 用户空间对象记录(记录类型 = 6)
- 内核对象记录(记录类型 = 7)
- 时间安排记录(记录类型 = 8)
- 日志记录(记录类型 = 9)
- 大型 BLOB 记录(记录类型 = 15,大型类型 = 0)
记录标题
所有记录都包含此标头,可指定记录的类型和大小 和 48 位数据,其用法因记录类型而异。
格式
标题字词
[0 .. 3]
:记录类型[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 63]
:因记录类型而异(如果未使用,则必须为零)
大型记录标题
支持大于 32KB 的记录。大型记录具有 32 位大小字段,而不是普通的 12 位。
标题字词
[0 .. 3]
:记录类型 (15)[4 .. 35]
:记录大小(包括此字词),以 8 个字节的倍数表示[36 .. 39]
:大型记录类型[40 .. 63]
:因大型记录类型而异(如果未使用,则必须为零)
元数据记录(记录类型 = 0)
提供后续跟踪记录数据的元数据。
此记录类型专供跟踪管理器在生成 跟踪记录归档。它不得由跟踪记录提供程序本身发出。 如果跟踪管理器在生成的跟踪记录中遇到元数据记录 跟踪提供程序会将其视为垃圾并跳过它。
元数据记录有多种子类型,每种类型都包含不同的 信息。
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:元数据类型[20 .. 63]
:因元数据类型而异(如未使用,则必须为零)
提供方信息元数据(元数据类型 = 1)
此元数据标识为以下活动贡献信息的跟踪提供方: 跟踪。
在下一个提供方版块元数据之前提供的所有数据,或者 提供方信息元数据必须从 同一提供商
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:元数据类型 (1)[20 .. 51]
:提供方 ID(用于在跟踪记录中标识提供方的令牌)[52 .. 59]
:名称长度(以字节为单位)[60 .. 63]
:预留(必须为零)
提供方名称信息流
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
提供方部分元数据(元数据类型 = 2)
这些元数据划分了从 不同提供商
在下一个提供方版块元数据之前提供的所有数据,或者 系统会假定所遇到的提供方信息元数据已收集 来自同一家提供商
读取的轨迹包含来自不同来源的轨迹的累积 跟踪提供程序,读取器必须针对每个提供程序的 跟踪记录(例如初始化数据、字符串表、线程表、 用户空间对象表和内核对象表)并切换上下文 每当遇到新的提供方部分元数据记录时。
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:元数据类型 (2)[20 .. 51]
:提供方 ID(用于在跟踪记录中标识提供方的令牌)[52 .. 63]
:预留(必须为零)
提供方事件元数据(元数据类型 = 3)
此元数据会提供提供程序的运行通知, 想要举报。
此记录可能会出现在输出中的任何位置,并且不会分隔 前后的内容
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:元数据类型 (3)[20 .. 51]
:提供方 ID(用于在跟踪记录中标识提供方的令牌)[52 .. 55]
:事件 ID[56 .. 63]
:预留(必须为零)
事件
已定义以下事件。
0
:缓冲区已满,记录可能被丢弃
跟踪记录信息元数据(元数据类型 = 4)
此元数据提供有关整个跟踪记录的信息。此记录 未与特定提供商相关联。
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:元数据类型 (4)[20 .. 23]
:跟踪记录信息类型[24 .. 63]
:因跟踪记录信息类型而异(如未使用,则必须为零)
魔数记录(轨迹信息类型 = 0)
此记录表明二进制数据位于紫红色
跟踪格式。通常,它应出现在跟踪记录的开头。它搭载
没有其他信息。魔数 0x16547846
是字符串“FxT”
后跟随机选择的字节。
允许将跟踪记录的前 8 个字节一起视为魔法命令 无需考虑内部记录结构,则此记录类型为 不可扩展的。记录不得包含除标题以外的任何其他字词 且没有保留字段。作为一个 8 字节的数字,整个 记录的值为 0x0016547846040010。
请注意,该值以及跟踪记录中的所有其他字词的字节顺序, 取决于编写跟踪记录的系统的字节序。一点点 字节序系统,前八个字节为 10 00 04 46 78 54 16 00。在一个大型 字节序系统,则其反过来:00 16 54 78 46 04 00 10。
格式
标题字词
[0 .. 3]
:记录类型 (0)[4 .. 15]
:记录大小(包括此字词)为 8 个字节 (1) 的倍数[16 .. 19]
:元数据类型 (4)[20 .. 23]
:跟踪记录信息类型 (0)[24 .. 55]
:魔数 0x16547846[56 .. 63]
:零
初始化记录(记录类型 = 1)
提供解释后续记录所需的参数。缺席 读取器可能会假设 1 个 tick 为 1 纳秒。
格式
标题字词
[0 .. 3]
:记录类型 (1)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 63]
:预留(必须为零)
刻度系数字词
[0 .. 63]
:每秒的基点数
字符串记录(记录类型 = 2)
在字符串表中注册一个字符串,并在
范围:0x0001
- 0x7fff
。该注册将取代之前的所有注册
指定字符串索引的值。
尝试为字符串索引 0x0000
设置值的字符串记录必须是
会被忽略,因为该值已预留代表空字符串。
我们必须允许包含空字符串的字符串记录,但 无意义,因为在字符串 ref 中,空字符串可以直接编码为 0。
格式
标题字词
[0 .. 3]
:记录类型 (2)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 30]
:字符串索引(范围 0x0001 到 0x7fff)[31]
:始终为零 (0)[32 .. 46]
:字符串长度(以字节为单位,范围为 0x0000 到 0x7fff)[47]
:始终为零 (0)[48 .. 63]
:预留(必须为零)
字符串值流
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
线程记录(记录类型 = 3)
在线程表中注册进程 ID 和线程 ID 对,并为其分配
0x01
到 0xff
之间的线程索引。注册将取代
解释记录时为给定线程索引提前注册
紧随其后。
保留线程索引 0x00
,用于表示在
线程参考。尝试设置此值的线程记录
必须忽略。
格式
标题字词
[0 .. 3]
:记录类型 (3)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 23]
:线程索引(绝不是 0x00)[24 .. 63]
:预留(必须为零)
进程 ID 字词
[0 .. 63]
:进程 koid(内核对象 ID)
会话 ID 字词
[0 .. 63]
:线程 koid(内核对象 ID)
事件记录(记录类型 = 4)
描述带有时间戳的事件。
此记录包含有关该事件的一些基本信息,包括: 事件发生的时间和地点,后跟事件参数和事件子类型 特定数据。
格式
标题字词
[0 .. 3]
:记录类型 (4)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:事件类型[20 .. 23]
:参数数量[24 .. 31]
:线程(线程引用)[32 .. 47]
:类别(字符串引用)[48 .. 63]
:名称(字符串 ref)
时间戳字词
[0 .. 63]
:基点数量
process id word(除非线程引用表示内嵌线程,否则省略)
[0 .. 63]
:进程 koid(内核对象 ID)
thread id word(除非线程引用表示内嵌线程,否则会被省略)
[0 .. 63]
:线程 koid(内核对象 ID)
category stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
name stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数数据(对每个参数重复)
- (见下文)
事件类型特定数据
- 可以是: <ph type="x-smartling-placeholder">
即时事件(事件类型 = 0)
在此会话中标记时刻。这些元素相当于 Zircon 内核探测。
格式
不需要特定于事件类型的数据。
计数器事件(事件类型 = 1)
将每个参数的样本值记录为关联的时序中的数据 替换为计数器的名称和 ID。这些值可以 堆叠面积图
格式
计数器词
[0 .. 63]
:计数器 ID
时长开始事件(事件类型 = 2)
标记特定线程上某项操作的开始。必须匹配 由时长结束事件触发。可以嵌套。
格式
不需要特定于事件类型的数据。
时长结束事件(事件类型 = 3)
标记特定线程上操作的结束。
格式
不需要特定于事件类型的数据。
时长完成事件(事件类型 = 4)
标记特定线程上某项操作的开始和结束。
格式
“结束时间”字词
[0 .. 63]
:基点的结束时间数量
异步开始事件(事件类型 = 5)
标记可能跨线程的操作的开始。必须匹配 由使用同一异步关联 ID 的异步结束事件触发。
格式
异步相关字词
[0 .. 63]
:异步关联 ID
异步即时事件(事件类型 = 6)
在可能跨线程的操作中标记时刻。必须显示 异步开始事件和异步结束事件之间使用相同的异步结束事件 关联 ID。
格式
异步相关字词
[0 .. 63]
:异步关联 ID
异步结束事件(事件类型 = 7)
标记可能跨线程的操作的结束。
格式
异步相关字词
[0 .. 63]
:异步关联 ID
流程开始事件(事件类型 = 8)
标记操作的开始,这会生成一系列操作 可能跨越多个线程或抽象层的应用。必须与 使用相同的流程关联 ID 的流程结束事件。我们可以想象 持续时间事件之间的箭头
流程的开头与封闭时长事件相关联 (针对此会话);它从所属时长事件的结束位置开始。
格式
用户流相关词
[0 .. 63]
:流关联 ID
流程步骤事件(事件类型 = 9)
标记流中的点。
该步骤与该线程的封闭时长事件相关联; 数据流在封闭时长事件开始并暂停时恢复 所属的 duration 事件结束位置。
格式
用户流相关词
[0 .. 63]
:流关联 ID
流程结束事件(事件类型 = 10)
标记流程的结束。
流程的结束与此 线程;该数据流会从所属 duration 事件开始的位置继续运行。
格式
用户流相关词
[0 .. 63]
:流关联 ID
BLOB 记录(记录类型 = 5)
提供要包含在跟踪记录中的未解释批量数据。可以是 有助于以其他格式嵌入捕获的轨迹数据。
blob 名称可唯一标识跟踪记录中的单独 blob 数据流。 通过以相同名称写入多个 blob 记录, 数据可以附加到先前创建的 BLOB。
BLOB 类型表示 BLOB 内容的表示。
格式
标题字词
[0 .. 3]
:记录类型 (5)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:blob 名称(字符串引用)[32 .. 46]
:以字节为单位的 blob 载荷大小(不包括填充)[47 .. 47]
:预留(必须为零)[48 .. 55]
:blob 类型[56 .. 63]
:预留(必须为零)
blob 名称流(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
payload stream(大小可变)
- 二进制数据,以 0 到 8 字节对齐进行填充
Blob 类型
定义了以下 blob 类型:
TRACE_BLOB_TYPE_DATA
=0x01
:原始非类型数据。消费者应该知道 如何使用它,比如视上下文而定。TRACE_BLOB_TYPE_LAST_BRANCH
=0x02
:Intel Performance Monitor 的最后一个分支记录。 该格式由 CPU 性能 监控。TRACE_BLOB_TYPE_PERFETTO =
0x03`:该 blob 包含从 Perfetto 语音组件。数据采用 Perfetto 的 Proto 格式, 格式。
用户空间对象记录(记录类型 = 6)
描述一个用户空间对象,为其分配标签,并且可以选择性地将其 作为参数的键/值数据。已添加对象的相关信息 添加到每个进程的用户空间对象表中。
当跟踪使用方遇到带有指针参数的事件时,该指针参数 值与进程对象表中的条目匹配,则可以交叉引用 将参数的指针值替换为之前的用户空间对象记录,以查找 引用的说明。
格式
标题字词
[0 .. 3]
:记录类型 (6)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 23]
:进程(线程引用)[24 .. 39]
:名称(字符串 ref)[40 .. 43]
:参数数量[44 .. 63]
:预留(必须为零)
指尖字词
[0 .. 63]
:指针值
process id word(除非线程引用表示内嵌线程,否则省略)
[0 .. 63]
:进程 koid(内核对象 ID)
name stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数数据(对每个参数重复)
- (见下文)
内核对象记录(记录类型 = 7)
描述一个内核对象,为其分配标签,并且可以选择性地将其 作为参数的键/值数据。已添加对象的相关信息 一个全局内核对象表
当跟踪记录使用方遇到包含 koid 参数的事件时 如果这个函数的值与内核对象表中的条目匹配, 将参数的 Koid 值与之前的内核对象记录交叉引用 查找该指示文字的说明。
格式
标题字词
[0 .. 3]
:记录类型 (7)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 23]
:内核对象类型(来自以下对象的 ZX_OBJ_TYPE_XXX 常量之一) zircon/syscalls/types.h[24 .. 39]
:名称(字符串 ref)[40 .. 43]
:参数数量[44 .. 63]
:预留(必须为零)
内核对象 ID 字词
[0 .. 63]
:koid(内核对象 ID)
name stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数数据(对每个参数重复)
- (见下文)
参数约定
按照惯例,跟踪记录写入器应包含以下具名实参 写入有关特定类型的对象的内核对象记录时。这个 有助于跟踪使用方关联内核对象之间的关系。
"process"
:对于ZX_OBJ_TYPE_THREAD
对象,指定 包含该线程的进程
时间安排记录(记录类型 = 8)
描述调度事件,例如线程被唤醒的时间或上下文 从一个线程切换到另一个线程。
格式
+---------(4)--------------+--------(48)--------+--(8)--+-(4)-+
| scheduling record type | <type specific> | size | 8 |
+--------------------------+--------------------+-------+-----+
标题字词
[0 .. 3]
:记录类型 (8)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 59]
:安排记录类型特有的数据[60 .. 63]
:时间安排记录类型
上下文切换记录(调度事件记录类型 = 1)
格式
+-(4)-+----(20)---+--------(4)-------+----(16)---+-------(4)-------+----(8)--+-(4)-+
| 1 | reserved | out thread state | cpu | argument count | size | 8 |
+-----+-----------+------------------+-----------+-----------------+---------+-----+
+---------------------------(64)------------------------------+
| timestamp |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| outgoing thread id |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| incoming thread id |
+-------------------------------------------------------------+
+--------------------------(...)------------------------------+
| argument data |
+-------------------------------------------------------------+
标题字词
[0 .. 3]
:记录类型 (8)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:参数数量[20 .. 35]
:CPU 编号[36 .. 39]
:传出线程状态[40 .. 59]
:预留[60 .. 63]
:安排记录类型 (1)
时间戳字词
[0 .. 63]
:基点数量
出站线程 ID
[0 .. 63]
:线程 koid(内核对象 ID)
来电会话 ID
[0 .. 63]
:线程 koid(内核对象 ID)
参数数据(每个参数的重复)
- (如需了解参数格式,请参阅参数)
参数约定
按照惯例,轨迹写入者还可以选择包含以下名称 在写入此记录时提供参数,以提供要跟踪的额外信息 。
"incoming_weight"
:Int32
,用于描述传入消息的相对权重 会话串"outgoing_weight"
:Int32
,用于描述传出的相对权重 会话串
线程唤醒记录(调度事件记录类型 = 2)
格式
+-(4)-+----(24)---+----(16)---+-------(4)-------+----(8)--+-(4)-+
| 2 | reserved | cpu | argument count | size | 8 |
+-----+-----------+-----------+-----------------+---------+-----+
+---------------------------(64)------------------------------+
| timestamp |
+-------------------------------------------------------------+
+---------------------------(64)------------------------------+
| waking thread id |
+-------------------------------------------------------------+
+--------------------------(...)------------------------------+
| argument data |
+-------------------------------------------------------------+
标题字词
[0 .. 3]
:记录类型 (8)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 19]
:参数数量。[20 .. 35]
:CPU 编号。[60 .. 63]
:安排记录类型 (2)
时间戳字词
[0 .. 63]
:基点数量
唤醒线程 ID
[0 .. 63]
:线程 koid(内核对象 ID)
参数数据(每个参数的重复)
- (如需了解参数格式,请参阅参数)
参数约定
按照惯例,轨迹写入者还可以选择包含以下名称 参数,以提供要跟踪的额外信息 。
"weight"
:Int32
,用于描述唤醒线程的相对权重
旧版上下文切换记录(上下文切换记录类型 = 0)
随着 Fuchsia 的时间安排在不断演变,此记录已不再有效 上下文切换模型。出于向后兼容性考虑,仍保留该前缀。
该记录指定在 上下文切换。根据定义,传入线程的新状态是 “跑步”因为它刚刚恢复了
格式
[0 .. 3]
:记录类型 (8)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 23]
:CPU 编号[24 .. 27]
:传出线程状态(“正在运行”之外的以下任意值)[28 .. 35]
:传出线程(线程引用)[36 .. 43]
:传入线程(线程引用)[44 .. 51]
:传出线程优先级[52 .. 59]
:传入线程优先级[60 .. 63]
:安排记录类型 (0)
时间戳字词
[0 .. 63]
:基点数量
传出进程 ID 字词(除非传出线程引用表示内嵌线程,否则会被省略)
[0 .. 63]
:进程 koid(内核对象 ID)
传出线程 ID 字词(除非传出线程引用表示内嵌线程,否则会被省略)
[0 .. 63]
:线程 koid(内核对象 ID)
传入进程 id 字词(除非传入线程 ref 表示内嵌线程,否则省略)
[0 .. 63]
:进程 koid(内核对象 ID)
传入线程 id 字词(除非传入线程 ref 表示内嵌线程,否则省略)
[0 .. 63]
:线程 koid(内核对象 ID)
线程状态
定义了以下线程状态:
0
:全新1
:正在运行2
:已暂停3
:已屏蔽4
:即将死亡5
:已终止
这些值与ZX_THREAD_STATE_XXX
zircon/syscalls/object.h.
日志记录(记录类型 = 9)
描述在特定时刻写入日志的消息。
格式
标题字词
[0 .. 3]
:记录类型 (9)[4 .. 15]
:记录大小(包括此字词),以 8 个字节的倍数表示[16 .. 30]
:日志消息长度,以字节为单位(范围 0x0000 到 0x7fff)[31]
:始终为零 (0)[32 .. 39]
:线程(线程引用)[40 .. 63]
:预留(必须为零)
时间戳字词
[0 .. 63]
:基点数量
process id word(除非线程引用表示内嵌线程,否则省略)
[0 .. 63]
:进程 koid(内核对象 ID)
thread id word(除非线程引用表示内嵌线程,否则会被省略)
[0 .. 63]
:线程 koid(内核对象 ID)
日志消息流
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
大型 BLOB 记录(记录类型 = 15,大型类型 = 0)
提供要嵌入到跟踪记录中的大型二进制 BLOB 数据。它 使用大型记录标头。
大型 BLOB 记录支持许多不同的格式。这些 格式可用于各种类型的 BLOB 数据和元数据 包含在记录中。
格式
标题字词
[0 .. 3]
:记录类型 (15)[4 .. 35]
:记录大小(包括此字词),以 8 个字节的倍数表示[36 .. 39]
:大型记录类型 (0)[40 .. 43]
:blob 格式类型[44 .. 63]
:预留,必须为零
带元数据的大型 Blob 记录(blob 格式 = 0)
此类型包含 blob 数据和记录中的元数据 本身。元数据包括时间戳、线程/进程 信息、参数,以及类别和名称。
名称应足以标识所含数据的类型 。
格式
标题字词
[0 .. 3]
:记录类型 (15)[4 .. 35]
:记录大小(包括此字词),以 8 个字节的倍数表示[36 .. 39]
:大型记录类型 (0)[40 .. 43]
:blob 格式类型 (0)[44 .. 63]
:预留,必须为零
格式标题字词
[0 .. 15]
:类别(字符串引用)[16 .. 31]
:名称(字符串 ref)[32 .. 35]
:参数数量[36 .. 43]
:线程(线程引用)[44 .. 63]
:预留,必须为零
category stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
name stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
时间戳字词
[0 .. 63]
:基点数量
process id word(除非线程引用表示内嵌线程,否则省略)
[0 .. 63]
:进程 koid(内核对象 ID)
thread id word(除非线程引用表示内嵌线程,否则会被省略)
[0 .. 63]
:线程 koid(内核对象 ID)
参数数据(对每个参数重复)
- (见下文)
blob 大小的单词
[0 .. 63]
:以字节为单位的 blob 载荷大小(不包括填充)
payload stream(大小可变)
- 二进制数据,以 0 到 8 字节对齐进行填充
带内大型 Blob 记录无元数据(blob 格式 = 1)
该类型包含记录本身内的 blob 数据, 但不包含元数据记录仅包含 类别和名称。
名称应足以标识所含数据的类型 。
格式
标题字词
[0 .. 3]
:记录类型 (15)[4 .. 35]
:记录大小(包括此字词),以 8 个字节的倍数表示[36 .. 39]
:大型记录类型 (0)[40 .. 43]
:blob 格式类型 (1)[44 .. 63]
:预留,必须为零
格式标题字词
[0 .. 15]
:类别(字符串引用)[16 .. 31]
:名称(字符串 ref)[32 .. 63]
:预留,必须为零
category stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
name stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
blob 大小的单词
[0 .. 63]
:以字节为单位的 blob 载荷大小(不包括填充)
payload stream(大小可变)
- 二进制数据,以 0 到 8 字节对齐进行填充
参数类型
参数会关联类型化键和值数据记录。结合使用 事件记录和用户空间对象记录,以及 内核对象记录。
每个参数都由一个字词标头后跟一个变量号组成 负载的字词。在许多情况下,标头本身足以对 参数的内容。
参数类型如下:
参数标头
所有参数都包含此标头,该标头用于指定参数的类型, 名称、大小以及 32 位数据; 参数类型。
格式
参数标头字词
[0 .. 3]
:参数类型[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:各不相同(如果未使用,则必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
Null 参数(参数类型 = 0)
表示仅出现在名称中的参数,而不显示值。
格式
参数标头字词
[0 .. 3]
:参数类型 (0)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
32 位有符号整数参数(参数类型 = 1)
表示 32 位有符号整数。
格式
参数标头字词
[0 .. 3]
:参数类型 (1)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:32 位有符号整数
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
32 位无符号整数参数(参数类型 = 2)
表示 32 位无符号整数。
格式
参数标头字词
[0 .. 3]
:参数类型 (2)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:32 位无符号整数
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
64 位有符号整数参数(参数类型 = 3)
表示 64 位有符号整数。如果某个值适合 32 位 请改用 32 位有符号整数参数类型。
格式
参数标头字词
[0 .. 3]
:参数类型 (3)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值字词
[0 .. 63]
:64 位有符号整数
64 位无符号整数参数(参数类型 = 4)
表示 64 位无符号整数。如果某个值适合 32 位 请改用 32 位无符号整数参数类型。
格式
参数标头字词
[0 .. 3]
:参数类型 (4)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值字词
[0 .. 63]
:64 位无符号整数
双精度浮点参数(参数类型 = 5)
表示双精度浮点数。
格式
参数标头字词
[0 .. 3]
:参数类型 (5)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值字词
[0 .. 63]
:双精度浮点数
字符串参数(参数类型 = 6)
表示字符串值。
格式
参数标头字词
[0 .. 3]
:参数类型 (6)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 47]
:参数值(字符串引用)[48 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值流(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
指针参数(参数类型 = 7)
表示指针值。有关引用的其他信息可以 由与同一指针关联的用户空间对象记录提供。
格式
参数标头字词
[0 .. 3]
:参数类型 (7)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值字词
[0 .. 63]
:指针值
内核对象 ID 参数(参数类型 = 8)
表示 koid(内核对象 ID)。有关 指代可以由与实体设备相关联的内核对象记录提供, 同一个笑脸。
格式
参数标头字词
[0 .. 3]
:参数类型 (8)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:预留(必须为零)
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充
参数值字词
[0 .. 63]
:koid(内核对象 ID)
布尔值参数(参数类型 = 9)
表示布尔值。
格式
参数标头字词
[0 .. 3]
:参数类型 (9)[4 .. 15]
:参数大小(包括此字词),以 8 个字节的倍数表示[16 .. 31]
:参数名称(字符串引用)[32 .. 63]
:用 0 填充 1 位
参数名称 stream(除非字符串 ref 表示内嵌字符串,否则省略)
- UTF-8 字符串,以 0 到 8 字节对齐方式填充