Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299750
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-11 15:54:17


第15 章• 脚本195
即使每次调用dtrace 命令都将得到不同的进程ID,此子句也始终会生成需要的结果。
D程序中可使用整数、标识符或字符串的任何位置均可使用宏变量。在解析输入文件时,
将只扩展宏变量一次(即,不递归扩展)。每个扩展的宏变量形成一个单独的输入标记,
不能与其他文本串联生成单个标记。例如,如果$pid 扩展为值456,则D代码:
123$pid
将扩展为两个相邻的标记123 和456,这将导致语法错误,而不会生成单个整数标记
123456。
宏变量在程序子句的开始位置扩展,并与D探测器说明内部的相邻文本串联。例如,以下
子句使用DTrace pid 提供器检测dtrace 命令:
pid$pid:libc.so:printf:entry
{
...
}
宏变量在每个探测器说明字段中仅扩展一次;它们不得包含探测器说明分界符(:)。
宏参数
D编译器还提供了一组与任何附加参数操作数(指定为dtrace 命令调用一部分)对应的宏
变量。可使用内置名称$0 表示D程序文件的名称或dtrace 命令、$1 表示第一个附加操作
数、$2 表示第二个操作数,依此类推,来访问这些宏参数。如果使用了dtrace -s 选项,则
$0 将扩展为与此选项配合使用的输入文件的名称的值。对于在命令行上指定的D程序,$0
扩展为用于执行dtrace 本身的argv[0] 的值。
宏参数可以扩展为整数、标识符或字符串,具体取决于相应文本的格式。与所有宏变量一
样,D程序中可使用整数、标识符和字符串标记的任何位置均可使用宏参数。以下所有示
例都可以构成带有相应宏参数值的有效D表达式:
execname == $1 /* with a string macro argument */
x += $1 /* with an integer macro argument */
trace(x->$1) /* with an identifier macro argument */
宏参数可用于创建dtrace 解释程序文件,这些文件以类似于实际Solaris 命令的方式操作,
并使用用户或其他工具指定的信息来修改其行为。例如,以下D解释程序文件跟踪按特定
进程ID 执行的write(2) 系统调用:
宏参数
196 Solaris 动态跟踪指南• 2006 年7 月
#!/usr/sbin/dtrace -s
syscall::write:entry
/pid == $1/
{
}
如果将此解释程序文件设置为可执行文件,则可以使用解释程序文件的附加命令行参数来
指定$1 的值:
# chmod a+rx ./tracewrite
# ./tracewrite 12345
产生的命令调用统计由进程ID 12345 执行的每个write(2) 系统调用。
如果D程序引用的宏参数不是在命令行上提供的,则会列显相应的错误消息,且程序将编
译失败:
# ./tracewrite
dtrace: failed to compile script ./tracewrite: line 4:
macro argument $1 is not defined
如果设置了defaultargs 选项,则D程序可以引用未指定的宏参数。如果设置
defaultargs,则未指定的参数的值将为0。有关D编译器选项的更多信息,请参见
第16 章。如果在命令行上指定了D程序未引用的附加参数,则D编译器也将生成错误消
息。
宏参数值必须与整数、标识符或字符串的格式匹配。如果参数与这些格式中的任何一种都
不匹配,则D编译器将报告相应的错误消息。将字符串宏参数指定到DTrace 解释程序文件
时,使用一对额外的单引号将该参数引起来可避免shell 解释双引号和字符串内容:
# ./foo ’"a string argument"’
如果要将D宏参数解释为字符串标记(即使这些参数与整数或标识符的格式匹配),请使
用两个前导美元符号(如$$1)作为宏变量或参数名称的前缀,以强制D编译器解释参数值
(就像参数值是由双引号引起来的字符串一样)。无论是使用$arg 还是$$arg 格式的宏来
引用D字符串转义序列,任何字符串宏参数中的所有常用D字符串转义序列(参见表
2–5)都将被扩展。如果已设置defaultargs 选项,则使用$$arg 格式引用的未指定参数的值
为空字符串("")。
宏参数
第15 章• 脚本197
目标进程ID
使用$target 宏变量可创建脚本,这些脚本可应用于所关注的特定用户进程(在dtrace 命
令行上使用-p 选项选择的进程或使用-c 选项创建的进程)。在创建或抓取进程且$target
变量扩展为第一个此类进程的整数进程ID 后,将编译在命令行上指定或使用-s 选项指定的
D程序。例如,以下D脚本可用于确定由特定主题进程执行的系统调用的分布:
syscall:::entry
/pid == $target/
{
@[probefunc] = count();
}
要确定由date(1) 命令执行的系统调用的数量,请将脚本保存在文件syscall.d 中并执行以
下命令:
# dtrace -s syscall.d -c date
dtrace: script ’syscall.d’ matched 227 probes
Fri Jul 30 13:46:06 PDT 2004
dtrace: pid 109058 has exited
gtime 1
getpid 1
getrlimit 1
rexit 1
ioctl 1
resolvepath 1
read 1
stat 1
write 1
目标进程ID
198 Solaris 动态跟踪指南• 2006 年7 月
munmap 1
close 2
fstat64 2
setcontext 2
mmap 2
open 2
brk 4
目标进程ID
第15 章• 脚本199
200
选项和可调参数
为了允许进行自定义,DTrace 为其使用者提供了多种重要的自由度。为最大限度地降低需
要特定调整的可能性,DTrace 将通过使用合理的缺省值和灵活的缺省策略来实现。但是,
可能会出现要求基于各个使用者调整DTrace 行为的情况。本章介绍DTrace 选项和可调参
数,以及可用于修改它们的接口。
使用者选项
通过设置或启用这些选项,可对DTrace 进行调整。下表中说明了可用的选项。对于一些选
项,dtrace(1M) 提供了对应的命令行选项。
表16–1DTrace 使用者选项
选项名称值dtrace(1M) 别名说明参见章节
aggrate time 聚合读取的速率第9 章
aggsize size 聚合缓冲区大小第9 章
bufresize auto 或manual 缓冲区调整大小策

第11 章
bufsize size -b 主体缓冲区大小第11 章
cleanrate time 清除速率第13 章
cpu scalar -c 启用跟踪的CPU 第11 章
defaultargs — 允许引用未指定的
宏参数
第15 章
destructive — -w 允许破坏性操作第10 章
dynvarsize size 动态变量空间大小第3 章
16 第1 6 章
201
表16–1DTrace 使用者选项(续)
选项名称值dtrace(1M) 别名说明参见章节
flowindent — -F 缩进函数输入并加
前缀->;取消缩进
函数返回并加前缀
<-。
第14 章
grabanon — -a 声明匿名状态第36 章
jstackframes scalar jstack() 的缺省栈
帧数
第10 章
jstackstrsize scalar jstack() 的缺省字
符串空间大小
第10 章
nspec scalar 随机数第13 章
quiet — -q 仅输出显式跟踪的
数据
第14 章
specsize size 随机缓冲区大小第13 章
strsize size 字符串大小第6 章
stackframes scalar 栈帧数第10 章
stackindent scalar 缩进stack() 和
ustack() 输出时要
使用的空格字符数
第10 章
statusrate time 状态检查的速率
switchrate time 缓冲区切换的速率第11 章
ustackframes scalar 用户栈帧数第10 章
对于表示大小的值,可以根据需要指定k、m、g 或t 作为后缀,以分别表示千字节、兆字
节、千兆字节和兆兆字节。对于表示时间的值,可以根据需要指定ns、us、ms、s 或hz 作
为后缀,以分别表示纳秒、微秒、毫秒、秒和每秒次数。
修改选项
在D 脚本中,可以使用#pragma D,并后跟字符串option 和选项名称来设置选项。如果选项
接受一个值,则该选项名称后应跟等号(=) 和选项值。以下示例都是有效的选项设置:
#pragma D option nspec=4
#pragma D option grabanon
#pragma D option bufsize=2g
修改选项
202 Solaris 动态跟踪指南• 2006 年7 月
#pragma D option switchrate=10hz
#pragma D option aggrate=100us
#pragma D option bufresize=manual
dtrace(1M) 命令还可在命令行中接受选项设置,作为-x 选项的参数。例如:
# dtrace -x nspec=4 -x grabanon -x bufsize=2g \
-x switchrate=10hz -x aggrate=100us -x bufresize=manual
如果指定的选项无效,dtrace 将指示该选项名称无效并退出:
# dtrace -x wombats=25
dtrace: failed to set option -x wombats: Invalid option name
#
同样,如果给定选项的选项值无效,dtrace 将指示该值无效:
# dtrace -x bufsize=100wombats
dtrace: failed to set option -x bufsize: Invalid value for specified option
#
如果多次设置某选项,则后续设置将覆写先前的设置。某些选项(如grabanon)只能设
置。此类选项表现为,您可以对其进行设置,但以后将无法取消该设置。
为启用匿名而设置的选项将由声明匿名状态的DTrace 使用者接受。有关启用匿名跟踪的信
息,请参见第36 章。
修改选项
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~