Solaris 动态跟踪指南

外部变量

D 使用反引号字符 (`) 作为访问操作系统(而非 D 程序)中所定义变量的特殊作用域运算符。例如,Solaris 内核包含一个名为 kmem_flags 的系统可调参数的 C 声明,用于启用内存分配器调试功能。有关 kmem_flags 的更多信息,请参见《Solaris Tunable Parameters Reference Manual》。此可调参数在内核源代码中声明为 C 变量,如下所示:

int kmem_flags;

要在 D 程序中访问此变量的值,请使用 D 表示法:

`kmem_flags

DTrace 将每个内核符号与在相应操作系统 C 代码中用于该符号的类型关联,从而使基于源代码访问本机操作系统数据结构更方便。要使用外部操作系统变量,需要访问相应的操作系统源代码。

从 D 程序访问外部变量时,访问的是其他程序的内部实现详细信息(如操作系统内核或其设备驱动程序)。这些实现详细信息不能构成可靠的稳定接口。在下次升级软件的相应部分时,所编写的依赖于这些详细信息的任何 D 程序可能会停止工作。因此,外部变量通常由内核和设备驱动程序开发者以及服务人员使用,以便使用 DTrace 调试性能或功能问题。要了解 D 程序稳定性的更多信息,请参阅第 39 章

内核符号名称存储在与 D 变量和函数标识符不同的名称空间中,因此您无需担心这些名称会与 D 变量发生冲突。在变量前加上一个反引号时,D 编译器为了找到匹配的变量定义,会使用已装入模块的列表按顺序搜索已知的内核符号。由于 Solaris 内核支持使用独立的名称空间动态装入的模块,所以在活动的操作系统内核中可多次使用相同的变量名称。可以通过在符号名称中指定应访问其变量的内核模块的名称并加上反引号,来解决这些名称冲突。例如,每个可装入内核模块通常提供一个 _fini(9E) 函数,以便引用名为 foo 的内核模块提供的 _fini 函数的地址,可写为:

foo`_fini

根据操作数类型的一般规则,可将任何 D 运算符应用于外部变量,但那些修改值的运算符除外。启动 DTrace 后,D 编译器将装入对应于活动内核模块的变量名称集,因此不需要声明这些变量。不能将修改变量值的任何运算符应用于外部变量,例如 =+=。出于安全原因,DTrace 将会阻止损坏或破坏所观察软件的状态。