Solaris 动态跟踪指南

稳定性计算和报告

D 编译器可对 D 程序中的所有探测器说明和操作语句进行稳定性计算。您可以使用 dtrace -v 选项显示程序的稳定性报告。以下示例使用在命令行上编写的程序:


# dtrace -v -n dtrace:::BEGIN'{exit(0);}'
dtrace: description 'dtrace:::BEGIN' matched 1 probe
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Stable
                Dependency Class: Common
CPU     ID                    FUNCTION:NAME
  0      1                           :BEGIN

您可能还希望将 dtrace -v 选项与 -e 选项进行组合,以指示 dtrace 编译但不执行 D 程序,从而在不必启用任何探测器并执行程序的情况下确定程序稳定性。以下为另一个稳定性报告示例:


# dtrace -ev -n dtrace:::BEGIN'{trace(curthread->t_procp);}'
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Private
                Dependency Class: Common
#

请注意,在新程序中,我们引用了 D 变量 curthread,该变量具有“稳定”名称和“专用”数据语义(即如果您查看该语义,将访问内核的专用实现详细信息),并且此状态现在显示在程序的稳定性报告中。在程序报告中,通过从每个接口的三重属性的对应值中,选择最低稳定性级别和类计算稳定性属性。

对于探测器说明,可根据提供器发布的属性,通过为所有指定的探测器说明字段选择最低稳定性属性来计算稳定性属性。在与各提供器对应的章节中,显示了可用的 DTrace 提供器的属性。对于 DTrace 提供器发布的所有探测器,该提供器可导出四个说明字段中每一个字段的三重稳定性属性。因此,提供器名称的稳定性可能高于所导出的各个探测器的稳定性。例如,探测器说明:

fbt:::

指示 DTrace 应跟踪项并从所有内核函数返回,其稳定性高于以下探测器说明:

fbt:foo:bar:entry

该说明指定了内核模块 foo 中的特定内部函数 bar()。为简单起见,大多数提供器都使用一组属性来描述其发布的所有单个 module:function :name 的值。另外,提供器还会为 args[] 数组指定属性,因为所有探测器参数的稳定性都视提供器而定。

如果探测器说明中没有指定提供器字段,则为其指定“不稳定/不稳定/公用”的稳定性属性,因为该说明可能无法与在 Solaris 将来版本中使用时尚不存在的提供器的探测器匹配。同样,Sun 无法保证该程序将来的稳定性和行为。编写 D 程序子句时,应始终显式指定提供器。另外,包含模式匹配字符(请参见第 4 章)或 $1 等宏变量(请参见第 15 章)的任何探测器说明字段,将被视为未指定,因为这些说明模式可能会进行扩展,以便与 Sun 在将来版本的 DTrace 和 Solaris OS 中发布的提供器或探测器匹配。

对于大多数 D 语言语句,通过在语句中为实体选择最低稳定性和类来计算稳定性属性。例如,下列 D 语言实体具有如下属性:

实体 

属性 

内置的 D 变量 curthread

稳定/专用/公用 

用户定义的 D 变量 x

稳定/稳定/公用 

如果编写以下 D 程序语句:

x += curthread->t_pri;

则产生的语句属性为“稳定/专用/公用”,该最低属性与操作数 curthreadx 关联。表达式的稳定性通过为各操作数选择最低稳定性属性进行计算。

会自动为程序中定义的任何 D 变量指定“稳定/稳定/公用”属性。另外,会为 D 语言语法和 D 运算符隐式指定“稳定/稳定/公用”属性。对于使用反引号 (`) 运算符引用内核符号,将始终为其指定“专用/专用/未知”属性,因为它们反映实现产物。在 D 程序源代码中定义的类型,尤其是与 C 和 D 类型名称空间关联的类型,将为其指定“稳定/稳定/公用”属性。在操作系统实现中定义的类型,以及其他类型的名称空间提供的类型,将为其指定“专用/专用/未知”属性。D 类型转换运算符生成的表达式的稳定性属性,为输入表达式属性和转换输出类型属性之间的较小者。

如果您使用 C 预处理程序来纳入 C 系统头文件,这些类型将与 C 类型名称空间关联,并会为其指定“稳定/稳定/公用”属性,因为 D 编译器除了假定您会负责这些声明外,没有其他选择。因此,如果您使用 C 预处理程序来纳入包含实现产物的头文件,则可能会在程序稳定性方面误导您自己。为确定合适的稳定性级别,应始终参阅与要纳入的头文件对应的文档。