有人能指点我如何理解/解释dtruss(mac)或dtrace输出的报告吗?
我刚试过一个简单的程序。例如,我得到以下输出:
PID/THRD SYSCALL(args) = return
250/0x103c: getattrlist("/Volumes/CORE/CORE.app\0", 0x7FFF5E8045D8, 0x7FFF5E804250) = 0 0
250/0x103c: geteuid(0x7FFF5E8045E0, 0x0, 0x7FFF5E804A18) = 501 0
250/0x103c: geteuid(0x7FFF5E805DF0, 0x0, 0x7FFF5E805E80) = 501 0
250/0x103c: geteuid(0x7FFF5E805540, 0x0, 0x7FFF5E805770) = 501 0
250/0x103c: getattrlist("/.vol/16777224/21\0", 0x7FFF5E8046D0, 0x7FFF5E803CF0) = 0 0
250/0x103c: geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8) = 501 0
250/0x103c: __mac_syscall(0x7FFF8D22057C, 0x50, 0x7FFF5E805990) = 0 0
250/0x103c: geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8) = 501 0
250/0x103c: __mac_syscall(0x7FFF8D22057C, 0x51, 0x7FFF5E8059A8) = -1 Err#30
250/0x103c: geteuid(0x7FFF5E8057D0, 0x0, 0x7FFF5E805848) = 501 0
250/0x103c: getattrlist("/.vol/16777224/21\0", 0x7FFF5E804960, 0x7FFF5E803F80) = 0 0
250/0x103c: open("/.vol/16777224/21\0", 0x0, 0x1FF) = 6 0
250/0x103c: geteuid(0x7FFF5E805790, 0x0, 0x7FFF5E805920) = 501 0
我可以看到所有这些系统调用采用十六进制参数。但我怎么解码这些呢?例如,如何找出实际尝试打开的文件?
答案 0 :(得分:5)
您的示例输出确实显示了open()系统调用的路径名(“/.vol/16777224/21”)。
dtruss是一个shell / DTrace脚本,类似于Solaris中的truss工具(Linux上的strace)。编码这些工具以了解如何以人类可读的方式显示参数。我在dtruss工具中对其中的一些进行了编码,但可以对其进行改进以了解更多信息。你可以制作一个dtruss的副本并自定义它以添加一些,因为它是一个shell / DTrace脚本。
对于显示十六进制数的系统调用,您可以从阅读手册页开始查看参数是什么。例如,geteuid()没有参数,因此dtruss打印3的默认行为为十六进制令人困惑。它应该打印无,并显示返回值。例如,可以通过更改以下部分来完成此操作:
/* print 0 arg output */
syscall::*fork:return
/self->start/
{
为:
/* print 0 arg output */
syscall::*fork:return,
syscall::geteuid:return
/self->start/
{
答案 1 :(得分:1)
dtrace 是一个低级但功能强大的工具,可用于监控许多内核级事件。监视或显示的内容在dtrace脚本中指定。 这些系统调用是由您正在监视的程序调用的内核级函数(而不是用户级函数本身)。
dtrace 允许您监控/量化每个进程或进程组的cpu,磁盘,内存,文件系统,网络等。
一个引用是Open Solaris DTrace site,但是有很多基于Web的指南和方法。
要查看您将使用的进程打开哪些文件:
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'