一直以来没太注意“arg0...arg9
”和args[]
之间的区别,基本就是混用。前几天在调试一个DTrace
脚本时,才注意起来,也在DTrace
的mailing list
里讨论了一下。以下就是我做的一些总结:
(1) “arg0...arg9
”是64位整数类型。如果probe
有参数,都可以通过“arg0...arg9
”访问。args[]
里每个参数的类型与具体的probe
相关,probe
不一定会提供args[]
。
(2)可以使用“dtrace -lvn
”命令来检查probe
是否提供了args[]
参数,举个例子:
bash-3.2# dtrace -lvn proc:::signal-handle
ID PROVIDER MODULE FUNCTION NAME
1163 proc genunix psig signal-handle
......
Argument Types
args[0]: int
args[1]: siginfo_t *
args[2]: int (*)()
bash-3.2# dtrace -lvn syscall::read:entry
ID PROVIDER MODULE FUNCTION NAME
58077 syscall read entry
......
Argument Types
None
可以看到proc:::signal-handle probe
提供了args[]
参数,而syscall::read:entry probe
没有。
(3)由于args[]
包含参数类型信息,所以可以用来灵活地访问参数。举个例子,在使用提供print
函数的DTrace
时,可以直接用print(arg[0])
或print(*arg[0])
打印参数内容。
综上所述,如果probe
提供了args[]
参数,一定要充分利用,可以写出很简单实用的脚本。