Solaris 动态跟踪指南

创建 SDT 探测器

如果您是设备驱动程序开发者,可能对在 Solaris 驱动程序中创建自己的 SDT 探测器感兴趣。禁用 SDT 的探测效果实际上是以不执行多个计算机指令为代价。所以,建议根据需要将 SDT 探测器添加到设备驱动程序中。如果这些探测器不对性能造成负面影响,则可以将其保留在提供的代码中。

声明探测器

使用 <sys/sdt.h> 中的 DTRACE_PROBEDTRACE_PROBE1DTRACE_PROBE2DTRACE_PROBE3DTRACE_PROBE4 宏声明 SDT 探测器。基于 SDT 探测器的模块名称和函数名称对应于探测器的内核模块和函数。探测器的名称取决于 DTRACE_PROBEn 宏中指定的名称。如果名称中不包含两个连续下条 (__),则探测器的名称与宏中指定的名称相同。如果名称中包含任何两个连续下条,则探测器名称会将该连续下条转换为一个破折号 (-)。例如,如果 DTRACE_PROBE 宏指定 transaction__start,则 SDT 探测器将被命名为 transaction-start。此替代允许 C 代码提供不是有效 C 标识符的宏名称,无需指定字符串。

DTrace 将内核模块名称和函数名称作为用于标识探测器的元组的一部分,因此无需在探测器名称中包括这些信息,以避免名称空间冲突。可以对驱动程序 module 使用命令 dtrace -l -P sdt -m module 来列出已安装的探测器和 DTrace 用户将可以看到的全名。

探测器参数

每个 SDT 探测器的参数都是在相应的 DTRACE_PROBEn 宏引用中指定的参数。参数的数量取决于用于创建该探测器的宏:DTRACE_PROBE1 指定一个参数,DTRACE_PROBE2 指定两个参数,依此类推。声明 SDT 探测器时,可通过不取消引用指针,并且不从探测器参数的全局变量中装入,来将已禁用的探测影响降至最低。在启用探测器的 D 操作中可以安全地取消引用指针和装入全局变量,因此 DTrace 用户可以只在需要这些操作时才请求这些操作。