trcfmt 文件格式
用途
存储跟踪模板。
描述
格式化跟踪报告的 特尔茨尔普特 命令使用跟踪模板来确定应该如何格式化包含在跟踪条目中的数据。 所有跟踪模板都存储在主模板文件 /etc/trcfmt中。 跟踪模板会标识跟踪挂钩标识,版本和发行版号,缩进级别,事件标签以及数据描述字段。 数据描述字段包含跟踪条目数据的格式化信息,并且可以根据需要进行多次重复,以格式化跟踪条目中的所有跟踪数据。
正在修改此文件
特尔克姆特 文件仅应使用 特鲁普达特 命令进行修改。 值小于 010 的跟踪挂钩供跟踪设施在内部使用。 如果这些挂钩发生更改,那么跟踪 (尤其是 特尔茨尔普特) 的性能将不可预测。
跟踪条目
- 包含跟踪挂钩标识以及挂钩类型或大小的挂钩字。
- 跟踪数据的可变词数。
- 时间戳记。
挂钩字的组织取决于生成该挂钩字的应用程序是 32 位应用程序还是 64 位应用程序。
32 位跟踪挂钩字:
| 项 | 描述 |
|---|---|
| HookWord | HookWord 的前两个字节包含 HookID 和 HookType。 后两个字节的内容取决于 HookType的值。 |
| HookID | HookID 在跟踪条目中表示为 3 十六进制数字。 对于用户程序,挂钩标识可能是范围从以下值开始的值:0x010至0x0FF.HookID在/usr/include/sys/trchkid.h文件中定义。 |
| HookType | HookType 是 4 位值,用于标识跟踪条目的其余部分的格式。 在记录跟踪条目时指定 HookType 。
|
64 位跟踪挂钩字:
| 项 | 描述 |
|---|---|
| HookWord | HookWord 的前两个字节包含内部跟踪元数据。 后两个字节包含跟踪条目的大小减去挂钩字和任何内部数据 (例如,时间戳记或 CPU 标识)。 第三个两个字节包含可以使用完整的两个字节的挂钩标识。 在该表单的 32 位应用程序中有效的 12 位挂钩标识0xhhh等效于 16 位挂钩标识0xhhh0在 64 位应用程序中。 最后两个字节表示子 hook 标识。 |
| HookID | HookID 在跟踪条目中表示为三个或四个十六进制数字。 四位钩子 ID 仅在AIX 6.1及更高版本中有效。 对于早于 AIX 6.1的发行版,挂钩标识可以是范围内的值0x010至0xFFF。对于 AIX 6.1 和更高发行版中的用户程序,挂钩标识可以是范围内的值0x0100至0xFFFF但是,如果第一个十六进制数字为零,那么最后一个数字也必须为零。 例如, HookID0AA0是合法的但是0AAA不是。 许多 AIX 系统挂钩标识是在 /usr/include/sys/trchkid.h 文件中定义的。 |
data pointer(数据指针)
DATA POINTER 是指向跟踪条目中的当前位置的指针。 特尔茨尔普特 会更改 DATA POINTER ,因为它会解释模板并设置跟踪条目的格式。 DATA POINTER 的初始位置是 HookTypes 的 HookWord 的第三个字节 1, 9, 2, A, 6,和E以及 HookTypes 的 HookWord 之后的第一个字节 0和8.
跟踪数据格式化
缩进级别
格式化的跟踪数据在对应于跟踪事件的源的列中对齐。 这在每个模板中使用 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 条目由以下内容组成:
- 一个'MatchValue',其类型(通常为数字)与格式代码相对应。
- 简单的 "字符串 ' " 或以花括号限定的新 "描述符 ' 。 描述符是由格式代码,字符串,开关和循环组成的序列。
- 逗号定界符。
该开关由不带逗号定界符的 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 宏的返回值如下所示:
未更改 DATA POINTER。 |
| $L1-$L2 | 长整型 (64 位) 数据字 1 或 2。 例如, $L1 是对 $d1 和 $d2的连接。 64 位值很可能是使用 TRCHK64L1 或 TRCHK64L2 宏跟踪的。 对数据指针没有更改。 |
| $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 | 定义跟踪宏。 |