如何在 dtrace 中找到参数的意思

Posted

技术标签:

【中文标题】如何在 dtrace 中找到参数的意思【英文标题】:how to find arguments mean in dtrace 【发布时间】:2013-12-30 13:03:34 【问题描述】:

代码

dtrace -n 'syscall::read:entry /execname != "dtrace"/  @reads[execname, fds[arg0].fi_pathname] = count(); '
   dtrace: description 'syscall::read:entry ' matched 1 probe
   ^C
   bash            /proc/1709/psinfo                                                 1
   loader          /zp/space/f2                                                      1
   nscd            /etc/user_attr                                                    1
   bash            /export/home/mauroj/.bash_history                                 2
   loader          /zp/space/f3                                                      2
   nscd            /etc/group                                                        2
   su              /etc/default/su                                                   8
   su              /devices/pseudo/sy@0:tty                                          9
   bash            /dev/pts/5                                                       66
   Xorg            /devices/pseudo/conskbd@0:kbd                                   152
   gnome-terminal  /devices/pseudo/clone@0:ptm                                     254

dtrace 代码fds[arg0].fi_pathname

如何查看 dtrace 调用参数是什么意思,我尝试使用

trace -lv 'syscall:fds:read:entry' |head
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN

    Probe Description Attributes
        Identifier Names: Stable
        Data Semantics:   Stable
        Dependency Class: Common

    Argument Attributes
        Identifier Names: Stable

但找不到参数? 怎么看这些说法是什么意思? 例如fds[arg0].fi_pathname

再举一个例子:

 dtrace -n 'io:::start  @bytes = quantize(args[0]->b_bcount); '

如何知道 args[0]->b_count 表示系统调用字节数

【问题讨论】:

由于您的问题是关于DTrace,它存在于各种平台上,您应该删除“linux”标签。 【参考方案1】:

正如documentation 解释的那样,对于系统调用提供程序的入口探测,arg0arg1 等是系统调用本身的参数。对于syscall::read:entry,然后,查看read(2) 手册页显示

 ssize_t read(int fildes, void *buf, size_t nbyte);

所以arg0fildes 的值。

不幸的是,fds[] 似乎没有在官方文档中描述。 fds[] 类似于子例程,DTrace 将文件描述符提供给translate 到fileinfo_tfileinfo_t 是一个稳定的结构,它提供有关文件的有用信息,而不会向用户公开实现细节。

io provider 的文档指出,对于 io:::startargs[0] 是指向 struct buf 的指针。这是另一个文档错误:它实际上是指向 struct bufinfo 的指针,在同一页上对此进行了描述。

【讨论】:

以上是关于如何在 dtrace 中找到参数的意思的主要内容,如果未能解决你的问题,请参考以下文章

DTrace - 如何在返回探针中正确检索初始参数

如何用 D 语言正确打印 uint64_t (dtrace)

dtrace 脚本输出是啥意思?

如何在 DTrace 操作中打印 CFStringRef?

FreeBSD 用户空间 DTrace 和用户空间的转储函数参数

如何在 SmartOS 上使用 HotSpot DTrace 探针?