首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何编写跟踪格式条目--构建跟踪格式条目块

如何编写跟踪格式条目--构建跟踪格式条目块

构建跟踪格式条目块宏宏(macro)与 C 程序中的 #define statements 类似,在该语句中,将对这些宏定义一个任务并在需要时进行调用。跟踪格式基础架构提供了一些预定义的宏,可对跟踪条目执行一些基本的任务。本节将讨论其中一些重用的宏。  
  • $DATAPOINTER:包含从跟踪条目起始部分到当前位置的位移。值的范围介于 0 到跟踪条目的长度之间。
  • $BASEPOINTER:指向跟踪条目的起始位置,通常为 0。
  • $HOOKENV:表示是否来自 32 位或 64 位环境。值为 32 或 64。
  • $D1-$D5:提供跟踪条目的数据字的值,范围为 1 到 5。
  • $GENERIC:表示是否使用泛型跟踪 API 记录跟踪条目。
表 1.  $GENERIC 宏值的解释值含义0非泛型跟踪 API1泛型跟踪 API
  • $HD:提供子钩子 ID 信息。但是对于 32 位泛型跟踪,HD 指的是所跟踪的泛型数据的长度。
  • $HL:指钩子数据的长度,单位为字节。在泛型跟踪中,该长度指的是所跟踪的泛型数据的长度。
表 2. 非泛型跟踪条目
32 bit64 位DATAPOINTER(初始值)26第一个数据字(D1)起始位移为 48
表 3. 泛型跟踪条目
32 位64 位DATAPOINTER(初始值)46第一个数据字(D1)起始位移为 48可变数据起始位移为 816
备注:宏对于访问定义明确的跟踪条目非常有用。为了操作作为跟踪条目一部分而记录的数据中的数据,我们使用了格式代码,这些内容将在下一小节中讨论。  
格式代码格式代码用于获取 DATAPOINTER 指示的数据字部分或上述任意宏返回的数据。下表列出了一些常用的格式代码。
表 4. 缩进格式格式解释L=APPL将左边界移动到第一列L=SVC将左边界移动到第二列L=KERN将左边界移动到第三列L=INT将左边界移动到第四列
示例:
使用这些对齐方式后,用户可以很容易发现跟踪条目是来自应用程序、系统调用、内核服务例程还是中断。在下面的代码中,诸如 APPL、SYSCALL 等标记都有一个列编号,表示了它们所属的列。
1
ID    ELAPSED_SEC    DELTA_MSEC   APPL(1st)    SYSCALL(2nd) KERNEL(3rd)  INTERRUPT(4rth)




表 5. 操作 DATAPOINTER 的代码格式解释Gm.n将 DATAPOINTER 宏设置为 “m” 字节,让它位于跟踪条目中的 “n” 位之后。  Om.n将 DATAPOINTER 宏推进 “m” 个字节,让它位于跟踪条目中的 “.n” 位之后。Rm在跟踪条目中将 DATAPOINTER 宏递减 “m” 个字节。 Wm将 DATAPOINTER 放在单词 m 所在的位置。字长为 4 或 8 字节,具体取决于执行的是 32 位格式跟踪还是 64 位格式跟踪。
示例:
G8:相当于 {{ DATAPOINTER = 8 }}(表示访问跟踪条目中的第八个字节)。
下表包含一些常用的格式代码。要查看完整列表,请参见  小节。
表 6. 导致数据输出的代码格式解释Am.n左侧调整 ASCII,其中 m = 字节长度,n = 所示字段的宽度 Bm.n二进制格式的输出,其中 m = 字节长度,n 是 m 字节后要显示的位数 Xm  “m” 字节的十六进制格式输出,其中 “m” 是 0 到 16 之间的值Dm带符号的十进制格式输出,“m” 是要显示的字节数 Um不带符号的十进制格式输出,“m” 是要显示的字节数Om八进制格式输出,“m” 是要显示的字节数。F4浮点格式输出(类似于 %0.4E,数据长度 = 4)F8浮点格式输出(类似于 %0.8E,数据长度 = 8)HB trcgen() 可变长度缓冲器中的字节数。HT32 位钩子:
  hooktype (0 - E)
trcgen = 0, trchk = 1, trchl = 2, trchkg =            6 trcgent = 8, trchkt = 9, trchlt = A, trchkgt = E
HT & 0x07            屏蔽时间戳位
64 位钩子
            0x8000 - 钩子被标记了时间戳。
0x4000 - 这是一个泛型跟踪。
示例:
  • $HD%D1:获得 $HD 返回的 1 个字节的数据并用十进制格式显示。DATAPOINTER 保持不变,因为数据来自宏。
  • D1:获得 DATAPOINTER 指向的位置返回的 1 个字节的数据,采用十进制格式。DATAPOINTER 增加一个字节。
SWITCH 语句语法:
1
2
3
4
Format_code ,
Matchvalue1 { descriptor },
Matchvalue2 { descriptor2 },
\* { default_descriptor }




格式代码后面加一个逗号就是一条 SWITCH 语句。SWITCH 语句的每个 CASE 条目的组成内容包括:
  • 一个 ‘匹配值’ 和一个类型(通常为数值),与格式代码对应
  • 一个简单的 ‘字符串’ 或一个新的 ‘描述符',使用大括号括起。描述符是一组格式代码、字符串、switch 语句和循环
  • 逗号分隔符
  switch 语句由 CASE 条目终止,无需逗号分隔符。选中的 CASE 条目是匹配值等于格式代码扩展的第一个条目。特殊匹配值 ‘\*' 是一个通配符,可以匹配任何值。DATAPOINTER 是根据格式代码向前推进的。  
备注:如果数据来自泛型跟踪 API 等,那么将根据子钩子 ID 之类的因素采取相应的操作。  
LOOP 语句语法:
1
LOOP format_code { descriptor }




描述符被运行 N 遍,其中的 N 是格式代码的数字值。DATAPOINTER 是根据格式代码和描述符的行为向前推进的。循环用于输出二进制缓冲器数据,因此描述符通常为 X1 或 X0。 请注意,X0 与 X1 类似,但是没有在每个字节之间提供空格分隔符 ‘ ’。类似地情况还包括 A0 和 A1。如果结合使用格式代码和宏,那么 DATAPOINTER 中的修改只能通过描述符表示。参考宏小节中的示例,获得有关的详细信息。
备注:当可变数据的长度是非静态的,并且被写为跟踪条目中的数据的一部分,那么此时适合使用循环。  
自定义宏宏是临时变量(只在事件期间有效),工作原理与 shell 变量相似。
语法:
1
2
3
4
5
6
7
   {{ $xxx = EXPR }}
EXPR is a combination of format codes, macros, and constants.
   Allowed operators are + - / *
   For example:
{{ $dog = 7 + 6 }} {{ $cat = $dog * 2 }} $dog $cat
   will output:
000D 001A




备注:宏也适用于循环数并不总是从数据开始的循环。
1
G1.5 {{ $count = B0.5 }} G11 LOOP $count {X0}




此处,我们从第一个字节后的第 5 位获取计数,而真正的数据从第 11 字节开始。对于这种情况,使用宏将有助于编写跟踪格式条目。
模板子例程如果宏名称包含 3 或 4 个十六进制数字,那么这是一个模板例程。模板的跟踪 ID 就是宏的名称,插入它是为了替代宏。数据指针指向发生模板替代的位置。在模板结束时,模板子例程对数据指针所作的任何更改都将持续有效。在模板子例程内使用的宏与调用模板中的宏是一致的。在被调用的模板中,宏的第一个定义与被调用版本中的第一个定义是同一个变量。名称没有关联。
备注:模板子例程的嵌套最多可以达到十级。宏和模板子例程之间有一处细微的差别。两者都是为了避免重新编写相同的格式。但是,模板子例程可以充当已定义的钩子标识符的跟踪条目格式程序,而宏没有这项功能。
BITFLAGS语法:
1
2
3
4
5
6
BITFLAGS [format_code|register],
flag_value string {optional string if false},   

--- or  ----

'&' mask field_value string




该语句简化了对状态标志的扩展,因为它看上去非常类似于一组 #define 语句。'&' mask 用于解释位字段。对寄存器和 mask 值执行 '&' 操作的结果将与 field_value 进行比较。如果 field_value 与提供的某个选项匹配,则会输出相对应的字符串。flag_value 和 mask 的基值是 16,如果使用了格式代码,DATAPOINTER 将被向前推进。                    
现在,假设您需要输出某个文件的权限。为此,您需要查看它的权限。如果文件只有只读权限,那么输出将为 r--。
在下面的样例代码中,如果 $omode%o4 的值是 00400,则会输出 r,否则输出 -。对 0020 将会采取类似的操作。
1
2
3
BITFLAGS $omode%o4, \
00400 "r" "-" \
00200 "w" "-" \




必须显示或不显示所有内容的情况:
1
2
3
4
BITFLAGS $omode%o4, \
& 012 040   "I"
& 012 020   "B"
& 012 080   "M"




使用 $omode%o4 值掩盖 012 后,如果值为 040,则输出 I。如果值为 020,则输出 B。如果值为 080,则输出 M。
返回列表