Solaris 动态跟踪指南

定义提供器和探测器

.d 源文件中定义 DTrace 探测器,该源文件将在编译和链接应用程序时使用。首先,选择用户应用程序提供器的正确名称。对于正在执行应用程序代码的每个进程,会在进程标识符前附加所选择的提供器名称。例如,如果为以进程 ID 1203 执行的 Web 服务器选择提供器名称 myserv,则与此进程对应的 DTrace 提供器名称应为 myserv1203。在 .d 源文件中,添加与以下示例类似的提供器定义:

provider myserv {
	...
};			

接下来,为每个探测器和相应参数添加定义。以下示例定义选择探测器位置中讨论的两个探测器。第一个探测器有两个参数,都为 string 类型,第二个探测器没有参数。D 编译器会将任何探测器名称中的两个连续下划线 (__) 都转换为一个连字符 (-)。

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};

应该向提供器定义中添加稳定性属性,以便探测器的使用者了解在应用程序的将来版本中发生变化的可能性。有关 DTrace 稳定性属性的更多信息,请参见第 39 章。稳定性属性的定义如下例所示:


示例 34–1 myserv.d:静态定义的应用程序探测器

#pragma D attributes Evolving/Evolving/Common provider myserv provider
#pragma D attributes Private/Private/Unknown provider myserv module
#pragma D attributes Private/Private/Unknown provider myserv function
#pragma D attributes Evolving/Evolving/Common provider myserv name
#pragma D attributes Evolving/Evolving/Common provider myserv args

provider myserv {
	probe query__receive(string, string);
	probe query__respond();
};


注 –

使用用户添加的探测器中的非整型参数的 D 脚本必须使用 copyin()copyinstr() 函数来检索这些参数。有关更多信息,请参见第 33 章