代码
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意味着系统调用字节
答案 0 :(得分:3)
正如documentation所解释的那样,对于系统调用提供程序的条目探测,arg0
,arg1
等是系统调用的参数本身。对于syscall::read:entry
,然后查看read(2)
手册页显示
ssize_t read(int fildes, void *buf, size_t nbyte);
所以arg0
是fildes
的价值。
不幸的是,fds[]
似乎没有在官方文档中描述。 fds[]
类似于子例程,DTrace将translate文件描述符提供给fileinfo_t
。 fileinfo_t
是一个稳定的结构,它提供有关文件的有用信息,而不会将实现细节暴露给用户。
io provider的文档指出,io:::start
,args[0]
是指向struct buf
的指针。这是另一个文档错误:它实际上是指向struct bufinfo
的指针,它在同一页面上描述。