了解Dtruss的输出

Gar*_*ary 4 linux macos dtrace system-calls

谁能指出我关于如何理解/解释dtruss(mac)或dtrace输出的报告的参考?

我只是在一个简单的程序上尝试过dtruss。例如,我得到以下输出:

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
Run Code Online (Sandbox Code Playgroud)

我可以看到所有这些使用十六进制参数的系统调用。但是我应该如何解码呢?例如,如何找出实际要打开的文件?

Bre*_*egg 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/
 {
Run Code Online (Sandbox Code Playgroud)

至:

 /* print 0 arg output */
 syscall::*fork:return,
 syscall::geteuid:return
 /self->start/
 {
Run Code Online (Sandbox Code Playgroud)


Pau*_*ulS 2

dtrace是一个低级别但功能强大的工具,可让您监视许多内核级别事件。监视或显示的内容在 dtrace 脚本中指定。这些系统调用是由您正在监视的程序调用的内核级函数(而不是用户级函数本身)。

dtrace允许您监视/量化每个进程或进程组的 cpu、磁盘、内存、文件系统、网络等。

一种参考是Open Solaris DTrace 站点,但是也有许多基于 Web 的指南和操作方法。

要查看哪些文件被进程打开,您可以使用:

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