如何在 solaris 上使用 dtrace 跟踪文件访问

cst*_*mas 5 solaris dtrace

我想了解如何在 Solaris 上跟踪(显示)文件访问。我已经找到了dtrace 工具包,希望voptrace能满足要求。我运行它,voptrace -t /my/path如果我lscat该路径下的文件不产生任何输出。我看错工具了吗?有人可以建议另一个人找到解决方案吗?

更新
@bahamat

好的,它给出了这样的错误消息:

dtrace: error on enabled probe ID 3 (ID 126: syscall::openat:entry): invalid address (0xffd19652) in predicate at DIF offset 28

重定向 stderr 后,它似乎实际上与我想要的非常接近。

bah*_*mat 10

Brendan Gregg在他的网站上有许多优秀的dtrace班轮。其中,这一行查看进程打开的文件:

dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
Run Code Online (Sandbox Code Playgroud)

扩展它,您可以通过添加谓词来观察正在打开的特定文件:

dtrace -n 'syscall::open*:entry /copyinstr(arg0)=="/etc/passwd"/ { printf("%s %s",execname,copyinstr(arg0)); }'
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

CPU     ID                    FUNCTION:NAME
  2  12622                     open64:entry cat /etc/passwd
Run Code Online (Sandbox Code Playgroud)

ls略有不同,因为ls file没有打开file。它stat改为使用(特别是lstat64),因此探针将是syscall::*stat*:entry


请注意,dtrace实现方式各不相同。上面的命令是在 illumos 上运行的。天啊。

  • 附加 2:您还可以将谓词替换为 `/strstr(copyinstr(self->file), "passwd") != NULL/` 以匹配相对/绝对路径名。 (2认同)