1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

“arg0…arg9”和args[]

一直以来没太注意“arg0...arg9”和args[]之间的区别,基本就是混用。前几天在调试一个DTrace脚本时,才注意起来,也在DTracemailing 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[]参数,一定要充分利用,可以写出很简单实用的脚本。

参考邮件:
http://www.listbox.com/member/archive/184261/2014/10/sort/time_rev/page/1/entry/2:23/20141031113022:D222181C-6112-11E4-A0DD-E8C04EEACA3B/

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.