跳过导航链接 | |
退出打印视图 | |
DTrace 用户指南 Oracle Solaris 10 8/11 Information Library (简体中文) |
复杂的 DTrace 探测器集合在命令行上可能难以管理。dtrace 命令支持脚本。您可以通过将 -s 选项以及脚本的文件名传递给 dtrace 命令来指定某个脚本。您还可以创建可执行的 DTrace 解释器文件。DTrace 解释器文件始终以 #!/usr/sbin/dtrace -s。
名为 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 语言支持文本字符串。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
可以使用 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 使用者选项
|
D 脚本可以引用一组内置的宏变量。这些宏变量是由 D 编译器定义的。
宏参数
有效的组 ID
有效的用户 ID
实际的组 ID
进程 ID
进程组 ID
父进程 ID
项目 ID
会话 ID
目标进程 ID
任务 ID
实际的用户 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