trcfmt 文件格式

用途

存储跟踪模板。

描述

格式化跟踪报告的 特尔茨尔普特 命令使用跟踪模板来确定应该如何格式化包含在跟踪条目中的数据。 所有跟踪模板都存储在主模板文件 /etc/trcfmt中。 跟踪模板会标识跟踪挂钩标识,版本和发行版号,缩进级别,事件标签以及数据描述字段。 数据描述字段包含跟踪条目数据的格式化信息,并且可以根据需要进行多次重复,以格式化跟踪条目中的所有跟踪数据。

正在修改此文件

特尔克姆特 文件仅应使用 特鲁普达特 命令进行修改。 值小于 010 的跟踪挂钩供跟踪设施在内部使用。 如果这些挂钩发生更改,那么跟踪 (尤其是 特尔茨尔普特) 的性能将不可预测。

跟踪条目

为每个跟踪事件记录的数据由以下元素组成,按以下顺序排列:
  • 包含跟踪挂钩标识以及挂钩类型或大小的挂钩字。
  • 跟踪数据的可变词数。
  • 时间戳记。

挂钩字的组织取决于生成该挂钩字的应用程序是 32 位应用程序还是 64 位应用程序。

32 位跟踪挂钩字:

描述
HookWord HookWord 的前两个字节包含 HookIDHookType。 后两个字节的内容取决于 HookType的值。
HookID HookID 在跟踪条目中表示为 3 十六进制数字。 对于用户程序,挂钩标识可能是范围从以下值开始的值:0x0100x0FF.HookID/usr/include/sys/trchkid.h文件中定义。
HookType HookType 是 4 位值,用于标识跟踪条目的其余部分的格式。 在记录跟踪条目时指定 HookType
跟踪条目格式
1
跟踪条目仅由 HookWord组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
2
跟踪条目由 HookWord 和一个附加的跟踪数据字组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
6
跟踪条目由 HookWord 和最多五个额外的跟踪数据字组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
8
跟踪条目由 HookWord 和后跟可变字节数的跟踪数据和时间戳记的数据字组成。 HookWord 的第三个和第四个字节包含跟踪字后面的跟踪数据的字节数。 此类型的跟踪条目是使用 特尔金特 子例程或 特尔根克特 内核服务记录的。
9
跟踪条目由 HookWord 和时间戳记组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
A
跟踪条目由HookWord、一个额外的跟踪数据字和一个时间戳组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
E
跟踪条目由HookWord、最多五个附加跟踪数据字和一个时间戳组成。 HookWord 的第三个和第四个字节包含跟踪数据。 使用 特尔乔克乌特尔乔克 子例程记录此类型的跟踪条目。
0
跟踪条目由 HookWord 和后跟可变字节数的跟踪数据的数据字组成。 HookWord 的第三个和第四个字节包含跟踪字后面的跟踪数据的字节数。 此类型的跟踪条目是使用 特尔琴 子例程或 特尔根克 内核服务记录的。

64 位跟踪挂钩字:

描述
HookWord HookWord 的前两个字节包含内部跟踪元数据。 后两个字节包含跟踪条目的大小减去挂钩字和任何内部数据 (例如,时间戳记或 CPU 标识)。 第三个两个字节包含可以使用完整的两个字节的挂钩标识。 在该表单的 32 位应用程序中有效的 12 位挂钩标识0xhhh等效于 16 位挂钩标识0xhhh0在 64 位应用程序中。 最后两个字节表示子 hook 标识。
HookID HookID 在跟踪条目中表示为三个或四个十六进制数字。 四位钩子 ID 仅在AIX 6.1及更高版本中有效。 对于早于 AIX 6.1的发行版,挂钩标识可以是范围内的值0x0100xFFF。对于 AIX 6.1 和更高发行版中的用户程序,挂钩标识可以是范围内的值0x01000xFFFF但是,如果第一个十六进制数字为零,那么最后一个数字也必须为零。 例如, HookID0AA0是合法的但是0AAA不是。 许多 AIX 系统挂钩标识是在 /usr/include/sys/trchkid.h 文件中定义的。

data pointer(数据指针)

DATA POINTER 是指向跟踪条目中的当前位置的指针。 特尔茨尔普特 会更改 DATA POINTER ,因为它会解释模板并设置跟踪条目的格式。 DATA POINTER 的初始位置是 HookTypesHookWord 的第三个字节 1, 9, 2, A, 6,E以及 HookTypesHookWord 之后的第一个字节 08.

跟踪数据格式化

缩进级别

格式化的跟踪数据在对应于跟踪事件的源的列中对齐。 这在每个模板中使用 L=X 描述符进行标识。 L=X 命令的可能的值如下所示:

描述
L = APPL 输出 APPL (应用程序) 列中的跟踪数据。
L=SVC 在 SVC (系统调用) 列中输出跟踪数据。
L = KERN 输出 KERN (内核) 列中的跟踪数据。
L = INT 输出 INT (中断) 列中的跟踪数据。

continuation character(连续字符)

必须使用行末尾的 \ (反斜杠) 来继续下一行上的模板。

标签或文本字符串

单个字符串 (或标签) 可以由任意数量的空格或制表符分隔,但在跟踪报告上,除非其他格式结构生效,否则所有多余的空格都将压缩为一个空格。 标签用双引号 ("") 引起来。

描述
\n 输出到一个新行。 新行上的数据是根据在 INDING LEVEL 中设置的值左对齐的。
\t 插入选项卡。 使用固定制表符分隔 (8 个) 将制表符展开为空格。

格式代码

DATA POINTER 位置格式代码

描述
G m.n 将 DATA POINTER 设置为 byte.bit 位置 m.n
O m.n 通过 m.n byte.bits推进 DATA POINTER。
M 减少 DATA POINTER (以 M 字节为单位)。

输出格式代码

描述
B m.n 以二进制格式发送输出,其中 M 是数据长度 (以字节为单位) , N 是长度 (以位为单位)。 与其他打印格式代码不同, DATA POINTER 可以是位对齐的,并且不会向上舍入到下一个字节边界。
D2, D4 , D8 将数据转换为带符号十进制格式。 数据长度为 2 个字节, 4 个字节或 8 个字节,并且 DATA POINTER 以相同的字节数进行高级。
F4 将数据转换为 C 类型 "float" 浮点格式。 数据长度为 4 个字节,并且 DATA 4 以 4 个字节为单位进行高级。
F8 将数据转换为 C 类型 "双精度" 浮点格式。 数据的长度为 8 个字节,而 DATA POINTER 的 8 为 8 个字节。
S1, S2, S4 对 ASCII 字符串进行左对齐。 字符串的长度以数据的第一个字节 (半字,字) 为单位。 该字符串的长度不包括此字节。
T4 将接下来的 4 个字节作为日期和时间字符串输出。
U2, U4 , U8 将数据转换为无符号十进制格式。 数据长度为 2 个字节, 4 个字节或 8 个字节,并且 DATA POINTER 以相同的字节数进行高级。
XM 将数据转换为十六进制格式。 DATA POINTER 的高级值为 M 个字节。

解释器格式代码

描述
E1, E2, E4 将下一个字节 (Half_word , word) 输出为 "errno" 值,将数字代码替换为 /usr/include/sys/errno.h 文件中相应的 #define 名称。 DATA POINTER 的高级 1 4 2 或 4 个字节。
P4 使用下一个词作为进程标识,并输出具有该进程标识的可执行文件的路径名。 进程标识及其路径名由 跟踪 命令在跟踪开始时获取,并由 特尔茨尔普特 命令通过特殊 EXEC tracehook 获取。 DATA POINTER 的高级值为 4 个字节。

Switch 语句

SWITCH 语句是后跟逗号的格式代码。 SWITCH 语句的每个 CASE 条目由以下内容组成:

  1. 一个'MatchValue',其类型(通常为数字)与格式代码相对应。
  2. 简单的 "字符串 ' " 或以花括号限定的新 "描述符 ' 。 描述符是由格式代码,字符串,开关和循环组成的序列。
  3. 逗号定界符。

该开关由不带逗号定界符的 CASE 条目终止。 选择 CASE 条目作为其 MatchValue 等于扩展格式代码的第一个条目。 特殊匹配值 "\ *" 是通配符,与任何内容匹配。

DATA POINTER 以格式代码为高级。

循环语句

循环用来输出数据的二进制缓冲区; 因此, LOOP 的描述符通常为 X0 或 X1。 循环的语法是 LOOP format_code {descriptor}。 描述符会执行 N 次,其中 N 是格式代码的数字值。

DATA POINTER 通过格式代码和描述符的操作来进行高级。

宏是像 shell 变量一样工作的临时变量。 将使用以下语法为其分配值:

{{ $xxx = EXPR }}

其中 EXPR 是格式代码,宏和常量的组合。 运算符 + (加法) ,-(减法) ,/(除法) ,和 * (乘法)。 在宏中是允许的。

预定义的宏

宏名称 描述
$BASEPOINTER 将起始偏移量标记为事件。 缺省值为0但实际偏移量是 DATA POINTER 和 BASE_POINTER 的值的总和。 当事件的各个部分具有相同的结构并且可以由相同的模板打印,但可能有不同的起始点进入事件时,它将与模板子例程配合使用。
$BREAK 结束当前跟踪事件。
$D1 - $D5 数据字 1 到数据字 5。 未移动 DATA POINTER。
$DATAPINTER 激活 DATA POINTER。 它可以像其他用户宏一样进行设置和操作。
缺省值 请使用 DEFAULT 模板 008。
$ERROR 将错误消息输出到报告,并在处理当前描述符后从模板中退出。 该错误消息提供日志文件,该事件的开始的日志文件偏移量以及跟踪标识。
$EXECPATH 输出当前进程的可执行文件的路径名。
HB 美元 特尔琴 子例程可变长度缓冲区中的字节数。 这也就等于 16 位挂钩数据。
$HD 挂钩数据 (低于 16 位)。
美元 允许使用同一模板进行多个不同的 特尔乔克 子例程调用。 $HT 宏的返回值如下所示:
描述
1
hook 字
2
钩字和一个附加字
6
挂钩字和最多五个数据字
9
挂钩字和时间戳记
A
挂钩字,一个数据字和一个时间戳记
E
挂钩字,最多五个数据字,以及一个时间戳记。

未更改 DATA POINTER。

$L1-$L2 长整型 (64 位) 数据字 1 或 2。 例如, $L1 是对 $d1$d2的连接。 64 位值很可能是使用 TRCHK64L1TRCHK64L2 宏跟踪的。 对数据指针没有更改。
$LOGID0 事件开始时的当前日志文件偏移量。
$LOGIDX 此事件的当前日志文件偏移量。
$LOGFILE 返回正在处理的日志文件的名称。
$MCR0, $MCR1和 $MCRA 机器 MCR 寄存器 0,1 0 A。
$PID 输出当前进程标识。
$PMC1 - $PMC8 机器 PMC 注册 1 8 8。
$PURR 机器 PURR 寄存器。
$RELLINENO 此事件的行号。 第一 1 从 1 开始。
$SKIP 结束当前跟踪事件而不进行打印。
$STOP 立即结束跟踪报告。
$SVC 将当前系统调用的名称输出。
$TID 输出当前内核线程标识。
$TRACEID 将返回当前事件的跟踪标识。

内置宏

内置宏包括:

描述
buftofilename (bp) 按 buf struct 查找文件名。
fdinstall () 将 lookuppn 中的文件描述符和当前 v 节点安装为此进程标识的 file_descriptor/v 节点对。
fdtofilename () 查找给定文件描述符的文件名以获取此进程标识。 如果找不到文件名,那么不会输出任何内容。
Flih () 推进 "中断深度"。
lookuppninstall1 使用 特尔茨尔普特 命令将文件名作为当前文件进行安装。
lookuppninstall2 将 v-node 安装为当前 v-node。 它还会将 current_v-node/current_file 安装为 v-node/filename par。
pfsrdwrinstall1 (vp) 将此进程的当前 v 节点设置为 vp。
pfsrdwrinstall2 (VA.S,计数) 如果发生缺页故障,那么创建要填充为 VMM 挂钩的虚拟地址 /v 节点结构。
resume () 减少了中断深度。
setdelim () 禁止字符之间存在空格。
slihlookup () 查找第二级中断处理程序。
sidtofilename (sid) 按段标识查找文件名。
vmbufindland () 通过虚拟 page/sid 查找文件的 v-node ,并将 v-node 和 buf 作为 v-node/bp 对进行安装。 这将由 lvm 在关闭时使用。
v-nodetofename (vp) 按 v-node 查找文件名。
vpagetofilename (vpage , sid) 按 vpage 和 segment ID 查找文件名。

文件

描述
/etc/trcfmt 存储跟踪模板。
/usr/include/sys/trchkid.h 定义挂钩标识。
/usr/include/sys/trcmacros.h 定义跟踪宏。