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

文档信息

前言

1.  简介

2.  DTrace 基础知识

3.  使用 D 语言编写脚本

编写 D 脚本

可执行的 D 脚本

D 文本字符串

创建使用参数的 D 脚本

DTrace 内置变量

4.  使用 DTrace

索引

编写 D 脚本

复杂的 DTrace 探测器集合在命令行上可能难以管理。dtrace 命令支持脚本。您可以通过将 -s 选项以及脚本的文件名传递给 dtrace 命令来指定某个脚本。您还可以创建可执行的 DTrace 解释器文件。DTrace 解释器文件始终以 #!/usr/sbin/dtrace -s

可执行的 D 脚本

名为 syscall.d 的此示例脚本跟踪可执行文件每次进入每个系统调用时的可执行文件名称:

syscall:::entry
{
   trace(execname);
}

请注意,文件名以 .d 后缀结尾。这是 D 脚本的约定结尾。您可以从 DTrace 命令行使用以下命令运行此脚本:

# dtrace -s syscall.d
dtrace: description 'syscall ' matched 226 probes
CPU     ID                     FUNCTION:NAME
  0    312                     pollsys:entry    java
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    168                   sigaction:entry    dtrace
  0    168                   sigaction:entry    dtrace
  0     98                       ioctl:entry    dtrace
^C

您可以通过执行两个步骤通过在命令行上输入文件名运行此脚本。首先,确认文件的第一行调用了解释器。解释器调用行是 #!/usr/sbin/dtrace -s。然后,为文件设置执行权限。

示例 3-1 从命令行运行 D 脚本

# cat syscall.d
#!/usr/sbin/dtrace -s

syscall:::entry
{
   trace(execname);
}

# chmod +x syscall.d
# ls -l syscall.d
-rwxr-xr-x   1 root     other       62 May 12 11:30 syscall.d
# ./syscall.d
dtrace: script './syscall.d' matched 226 probes
CPU     ID                     FUNCTION:NAME
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    312                     pollsys:entry    java
  0    312                     pollsys:entry    java
  0    312                     pollsys:entry    java
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    234                   sysconfig:entry    dtrace
^C

D 文本字符串

D 语言支持文本字符串。DTrace 将字符串表示为以空字节终止的字符数组。字符串可见部分的长度取决于空字节的位置。DTrace 将每个字符串存储在大小固定的一个数组中,从而确保每个探测器跟踪一致的数据量。字符串不能超出预定义的字符串界限的长度。可以在您的 D 程序中修改该界限,也可以在 dtrace 命令行上通过调整 strsize 选项来修改该界限。有关可调整的 DTrace 选项的更多信息,请参见《Solaris 动态跟踪指南》中的第 16  章 "选项和可调参数"。缺省字符串限制为 256 字节。

D 语言提供了显式 string 类型,而不是使用 char * 类型来引用字符串。有关 D 文本字符串的更多信息,请参见《Solaris 动态跟踪指南》中的第 6  章 "字符串"

示例 3-2 将 D 文本字符串与 trace() 函数一起使用

# cat string.d

#!/usr/sbin/dtrace -s

fbt::bdev_strategy:entry
{
   trace(execname);
   trace(" is initiating a disk I/O\n");
}

文本字符串末尾的 \n 符号生成一个新行。要运行此脚本,请输入以下命令:

# dtrace -s string.d
dtrace: script 'string.d' matched 1 probes
CPU     ID                     FUNCTION:NAME
  0   9215               bdev_strategy:entry   bash is initiating a disk I/O

  0   9215               bdev_strategy:entry   vi is initiating a disk I/O

  0   9215               bdev_strategy:entry   vi is initiating a disk I/O

  0   9215               bdev_strategy:entry   sched is initiating a disk I/O

^C

dtrace 命令的 -q 选项仅记录在脚本中或者在命令行调用中显式指定的操作。此选项抑制了 dtrace 命令通常情况下会生成的缺省输出。

# dtrace -q -s string.d
ls is initiating a disk I/O
cat is initiating a disk I/O
fsflush is initiating a disk I/O
vi is initiating a disk I/O
^C

创建使用参数的 D 脚本

可以使用 dtrace 命令来创建可执行的解释器文件。该文件必须具有执行权限。文件的起始行必须为 #!/usr/sbin/dtrace -s。您可以在该行上指定 dtrace 命令的其他选项。在指定选项时,必须仅使用一个破折号 (-)。将 s 选项列在最后,如下例所示。

#!/usr/sbin/dtrace -qvs

可以在 D 脚本中使用 #pragma 行来指定 dtrace 命令的选项,如下面的 D 代码片段所示:

# cat -n mem2.d
     1  #!/usr/sbin/dtrace -s
     2
     3  #pragma D option quiet
     4  #pragma D option verbose
     5  
     6  vminfo:::
     ...

下表列出了可以在 #pragma 行中使用的选项名称。

表 3-1 DTrace 使用者选项

选项名
dtrace 别名
说明
aggrate
time
聚合读取的速率
aggsize
size
聚合缓冲区大小
bufresize
automanual
缓冲区调整大小策略
bufsize
size
-b
主体缓冲区大小
cleanrate
time
清除速率
cpu
scalar
-c
启用跟踪的 CPU
defaultargs
允许引用未指定的宏参数
destructive
-w
允许破坏性操作
dynvarsize
size
动态变量空间大小
flowindent
     - F
缩进函数输入并加前缀 ->;取消缩进函数返回并加前缀 <-
grabanon
-a
声明匿名状态
jstackframes
scalar
jstack() 的缺省栈帧数
jstackstrsize
scalar
jstack() 的缺省字符串空间大小
nspec
scalar
推理数
quiet
-q
仅输出显式跟踪的数据
specsize
size
推理缓冲区大小
strsize
size
字符串大小
stackframes
scalar
栈帧数
stackindent
scalar
缩进 stack()ustack() 输出时要使用的空格字符数
statusrate
time
状态检查的速率
switchrate
time
缓冲区切换的速率
ustackframes
scalar
用户栈帧数

D 脚本可以引用一组内置的宏变量。这些宏变量是由 D 编译器定义的。

$[0-9]+

宏参数

$egid

有效的组 ID

$euid

有效的用户 ID

$gid

实际的组 ID

$pid

进程 ID

$pgid

进程组 ID

$ppid

父进程 ID

$projid

项目 ID

$sid

会话 ID

$target

目标进程 ID

$taskid

任务 ID

$uid

实际的用户 ID

示例 3-3 PID 参数示例

此示例将正在运行的 vi 进程的 PID 传递给 D 脚本 syscalls2.d。该 D 脚本在 vi 命令退出时终止。

# cat -n syscalls2.d
     1  #!/usr/sbin/dtrace -qs
     2
     3  syscall:::entry
     4  /pid == $1/
     5  {
     6    @[probefunc] = count();
     7  }
     8  syscall::rexit:entry
     9  {
    10    exit(0);
    11  }

# pgrep vi
2208
# ./syscalls2.d 2208

  rexit                                               1
  setpgrp                                             1
  creat                                               1
  getpid                                              1
  open                                                1
  lstat64                                             1
  stat64                                              1
  fdsync                                              1
  unlink                                              1
  close                                               1
  alarm                                               1
  lseek                                               1
  sigaction                                           1
  ioctl                                               1
  read                                                1
  write                                               1