探针点规范

探针点规范包含一个或多个探针点元组。

每个探针点元组标识一个特定代码的位置(执行该代码时会触发调查操作)或一个特定事件(发生该事件时会触发调查操作)。 通过在 Vue 子句顶部提供以逗号分隔的探针元组列表,可以将多个探针点与同一组探针操作和谓词 (如果有) 相关联。

下面是一些受支持的探针类型:

  • 用户函数入口调查(或 uft 调查)
  • 系统调用入口或出口调查(或 syscall 调查)
  • 在特定时间间隔触发的调查(或 interval 调查)

有关受支持探针类型的完整列表,请参阅“探针管理器”部分。

探针点元组是由冒号分隔的可唯一标识探针点的有序字段列表。 虽然通常仅当探针点是探针位置时才会显示位置字段,但它有以下通用格式。

@@ <probetype>:
<one or more probetype-specific fields separated by colons>:<location>

探针管理器定义探针点元组中特定于探针类型的字段的可接受值以及探针元组的长度。 但是,定义探针点元组时所有的探针管理器都应遵循以下一般规则:

  • 每个探针点元组至少是 3 元组,即,它至少有 3 个字段。
  • 第一个字段始终标识探针类型,因此也会标识其探针管理器。
  • 对于支持特定于进程的跟踪的探针管理器,第二个字段必须是进程标识。
  • 对于支持函数入口或出口调查的探针管理器,位置字段(最后一个字段)必须使用 entryexit 关键字。
  • 字段由冒号 (:) 分隔。
  • 探针点元组中字段的星号(“*”符号)表示它与该字段的任何可能值相匹配。 例如,syscall 探针管理器允许对特定的进程进行系统调用或调查所有进程。 在第一种情况下,第二个字段必须是要调查的进程的进程标识。 在后一种情况下,如果要探测所有进程,那么第二个字段必须是“*”符号。 对字段第二次使用星号将在维护与现有脚本的二进制兼容性的同时,允许在将来进行更细致的调查。 例如,uft 探针管理器目前要求第三个字段是星号。 在将来,它可支持将模块名称用作第三个字段,以限制仅调查在该模块中定义的函数。
  • 探针规范的最大长度为 1023 个字符。

例如:

@@uft:34568:*:foo:entry
在标识为 34568 的进程中,在入口处调查任何名为 foo 的函数。 第三个字段中的星号表示如果 foo 函数存在于进程的任何模块中,那么将调查该函数。
@@syscall:*:read:exit
read 系统调用的出口处进行调查。 星号表示要调查所有进程的 read 系统调用。
@@interval:*:clock:500
每隔 500 毫秒(墙上时钟时间)触发一次调查。 星号是用来在将来支持更细致探针点的占位符。

在编写 Vue 脚本时,进程的进程标识通常未知。 Vue 提供了一个简单方法,以避免必须在探测器规范的第二个字段中或在 Vue 脚本中的任何位置 (例如,在谓词部分) 对进程标识进行硬编码。

单个 Vue 脚本可以包含来自用户空间和内核中多个进程的探针点。 所生成的任何跟踪输出总是按时间顺序显示。

除了探针管理器定义的常规探针点外, Vue 还支持两个特殊探针点。 每个 Vue 脚本可包含 @@BEGIN 探针点来指示在启用任何调查之前需要发出的任何操作,以及包含 @@END 探针点来指示在终止跟踪后要发出的任何操作。

动作项

操作块标识在触发相关联的探针点时要执行的跟踪操作。 受支持的操作不限于捕获和格式化跟踪数据,但可以使用 Vue 语言的全部功能。

Vue 中的操作块类似于过程语言中的过程。 它包括按顺序发出的一系列语句。 基本上按顺序执行流。 唯一的例外是可以使用“if-else”语句来进行有条件的执行,且可使用“return”语句从操作块返回控制权。 Vue 还支持终止整个脚本并结束跟踪会话的 exit 函数。 Vue 和 C 语言语句中没有用于循环的构造,因此不支持 "for" , "do" , "goto" 等。

与过程语言中的过程不同, Vue 中的操作块没有输出或返回值。 它本身不支持输入参数集。 另一方面,位于探针点(在此处开始进行调查)的上下文数据可在操作块中进行访问。 例如,如果探针点位于函数的入口点,那么可以在 Vue 子句的操作块中引用传递给函数的参数。

谓词

如果在探针点必须有条件地执行子句,那么您必须使用谓词。 谓词部分由紧跟在调查规范部分之后显示的 when 关键字标识。 谓词本身包含常规的使用双括号的 C 语言格式条件表达式。

谓词具有以下格式:
  	when ( <condition> )
例如:
when ( __pid == 1678 )