JavaScript is required to for searching.
跳过导航链接
退出打印视图
DTrace 用户指南     Oracle Solaris 10 8/11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  简介

2.  DTrace 基础知识

3.  使用 D 语言编写脚本

4.  使用 DTrace

性能监视

使用 sysinfo 提供器检查性能问题

跟踪用户进程

使用 copyin()copyinstr() 子例程

避免错误

消除 dtrace 干扰

syscall 提供器

ustack() 操作

pid 提供器

用户函数边界跟踪

跟踪任意指令

匿名跟踪

匿名启用

声明匿名状态

匿名跟踪示例

推理跟踪

推理接口

创建推理

使用推理

提交推理

放弃推理

推理示例

索引

匿名跟踪

本节描述了不与任何 DTrace 使用者关联的跟踪。在没有可以运行的 DTrace 使用者进程情况下才使用匿名跟踪。只有超级用户可以创建匿名跟踪。在任意时刻,只能存在一个匿名启用。

匿名启用

要创建匿名启用,请使用 -A 选项以及指定了所需的探测器、谓词、操作和选项的 dtrace 命令。dtrace 命令向 dtrace(7D) 驱动程序的配置文件添加一系列表示您的请求的驱动程序属性。该配置文件通常是 /kernel/drv/dtrace.conf。在加载 dtrace 驱动程序时,该驱动程序读取这些属性。该驱动程序将使用指定的操作启用指定的探测器,并创建与新的启用关联的匿名状态dtrace 驱动程序通常是随充当 dtrace 提供器的任何驱动程序按需加载的。为允许在引导期间进行跟踪,必须尽早装入 dtrace 驱动程序。dtrace 命令向 /etc/system 添加必需的 forceload 语句(请参见 system(4) 以了解每个必需的 dtrace 提供器和 dtrace 驱动程序)。

当系统引导时,dtrace 驱动程序发送一条消息,指明已成功处理配置文件。匿名启用可以设置正常使用 dtrace 命令期间可用的任何选项。

要删除匿名启用,请在不指定任何探测器描述的情况下为 dtrace 指定 -A 选项。

声明匿名状态

当计算机已完全引导后,您可以通过指定 dtrace 命令及 -a 选项来声明现有的匿名状态。缺省情况下,-a 选项会声明匿名状态并处理现有数据,然后继续运行。要使用匿名状态并退出,请添加 -e 选项。

如果已从内核使用了匿名状态,则匿名状态无法替换。如果您试图声明不存在的匿名跟踪状态,则 dtrace 命令会生成类似于下例的一条消息:

dtrace: could not enable tracing: No anonymous tracing state

如果发生删除或错误,dtrace 将在声明匿名状态时生成相应的消息。对于匿名和非匿名状态,删除消息和错误消息相同。

匿名跟踪示例

以下示例说明了 iprb(7D) 模块中每个探测器的匿名 DTrace 启用:

# dtrace -A -m iprb
dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf
dtrace: added forceload directives to /etc/system
dtrace: run update_drv(1M) or reboot to enable changes
# reboot

重新引导后,dtrace 驱动程序将在控制台上输出一条消息,指出驱动程序正在启用指定的探测器:

  ...
  Copyright 1983-2003 Sun Microsystems, Inc.  All rights reserved.
  Use is subject to license terms.
  NOTICE: enabling probe 0 (:iprb::)
  NOTICE: enabling probe 1 (dtrace:::ERROR)
  configuring IPv4 interfaces: iprb0.
  ...

在重新引导计算机后,指定 dtrace 命令及 -a 选项将使用匿名状态:

# dtrace -a
  CPU     ID                    FUNCTION:NAME
    0  22954                      _init:entry 
    0  22955                     _init:return 
    0  22800                  iprbprobe:entry 
    0  22934          iprb_get_dev_type:entry 
    0  22935         iprb_get_dev_type:return 
    0  22801                 iprbprobe:return 
    0  22802                 iprbattach:entry 
    0  22874               iprb_getprop:entry 
    0  22875              iprb_getprop:return 
    0  22934          iprb_get_dev_type:entry 
    0  22935         iprb_get_dev_type:return 
    0  22870             iprb_self_test:entry 
    0  22871            iprb_self_test:return 
    0  22958            iprb_hard_reset:entry 
    0  22959           iprb_hard_reset:return 
    0  22862       iprb_get_eeprom_size:entry 
    0  22826              iprb_shiftout:entry 
    0  22828            iprb_raiseclock:entry 
    0  22829           iprb_raiseclock:return 
  ...

以下示例侧重于通过 iprbattach() 调用的那些函数。

fbt::iprbattach:entry
{
    self->trace = 1;
}

fbt:::
/self->trace/
{}

fbt::iprbattach:return
{
    self->trace = 0;
}

运行以下命令清除驱动器配置文件中先前的设置,安装新的匿名跟踪请求,然后重新引导:

# dtrace -AFs iprb.d
dtrace: cleaned up old anonymous enabling in /kernel/drv/dtrace.conf
dtrace: cleaned up forceload directives in /etc/system
dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf
dtrace: added forceload directives to /etc/system
dtrace: run update_drv(1M) or reboot to enable changes
# reboot

重新引导后,dtrace 驱动程序将在控制台上输出一条不同的消息,指示有些许差别的启用:

  ...
  Copyright 1983-2003 Sun Microsystems, Inc.  All rights reserved.
  Use is subject to license terms.
  NOTICE: enabling probe 0 (fbt::iprbattach:entry)
  NOTICE: enabling probe 1 (fbt:::)
  NOTICE: enabling probe 2 (fbt::iprbattach:return)
  NOTICE: enabling probe 3 (dtrace:::ERROR)
  configuring IPv4 interfaces: iprb0.
  ...

在计算机完成引导后,采用 -a-e 选项运行 dtrace 命令来使用匿名数据,然后退出。

# dtrace -ae
  CPU FUNCTION                                 
    0  -> iprbattach                            
    0    -> gld_mac_alloc                       
    0      -> kmem_zalloc                       
    0        -> kmem_cache_alloc                
    0          -> kmem_cache_alloc_debug        
    0            -> verify_and_copy_pattern     
    0            <- verify_and_copy_pattern     
    0            -> tsc_gethrtime               
    0            <- tsc_gethrtime               
    0            -> getpcstack                  
    0            <- getpcstack                  
    0            -> kmem_log_enter              
    0            <- kmem_log_enter              
    0          <- kmem_cache_alloc_debug        
    0        <- kmem_cache_alloc                
    0      <- kmem_zalloc                       
    0    <- gld_mac_alloc                       
    0    -> kmem_zalloc                         
    0      -> kmem_alloc                        
    0        -> vmem_alloc                      
    0          -> highbit                       
    0          <- highbit                       
    0          -> lowbit                        
    0          <- lowbit                        
    0          -> vmem_xalloc                   
    0            -> highbit                     
    0            <- highbit                     
    0            -> lowbit                      
    0            <- lowbit                      
    0            -> segkmem_alloc               
    0              -> segkmem_xalloc            
    0                -> vmem_alloc              
    0                  -> highbit               
    0                  <- highbit               
    0                  -> lowbit                
    0                  <- lowbit                
    0                  -> vmem_seg_alloc        
    0                    -> highbit             
    0                    <- highbit             
    0                    -> highbit             
    0                    <- highbit             
    0                    -> vmem_seg_create     
  ...