Ubuntu上的DTrace,怎么样?

我想在Ubuntu上使用DTrace。

https://github.com/dtrace4linux/linux

上面的Linux有一个github。

  • 我不知道dtrace for linux是否与其他操作系统(Solaris,FreeBSD,OSX)的dtrace相同。
  • 我想找一个使用这个(dtraceforlinux)的教程。
  • 我想知道下面的solaris的dtrace教程是否适合我。

http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html

先谢谢你。 Journeyer

作为dtrace4linux的作者,让我回答。

实质上,Linux / MacOS / FreeBSD / Solaris上的dtrace是相同的 – 我们都基于相同的源代码,具有相同的目标。 由于没有中央维护者,代码是有效的分支,Solaris被认为是主。 主要的源代码差异是每个平台的胶水。

DTrace是许多事物的组合:

  • 内核驱动
  • 用户空间“dtrace”命令
  • 探测函数机制(例如系统调用,fbt)
  • 脚本语言

看看系统调用跟踪它非常简单:

$ dtrace -n syscall::open: ..... 

这会陷入每一个开放的系统调用,无论是谁执行它。 如果你知道Unix,你知道系统调用大约是:

 open(char *filename, int flags, [int perms]) 

所以,arg0是字符串“filename”。 但这是事情的不同之处。 C库函数如上所述,但映射到一个系统调用,就像这样:

 open(int someflags, char *filename, int userflags, int perms) 

所以文件名不在arg0中,而是在arg1中。 (道歉,如果上述错误 – 我认为open()在内核和用户空间是相同的,但是这不是真实的,例如对于stat()系列函数)。

这就是DTrace的一些“可移植性”问题出现的地方 – 如果您使用Solaris指南进行跟踪,并尝试运行一些脚本或示例,则可能发现它们的工作方式不一样。 理论上讲,这是Linux(我的)错误,应该修改dtrace4linux来隐藏这个。

这一切都适用于系统调用。

现在让我们看看fbt。 Fbt只是函数跟踪 – 任何函数 – 带有任何参数。 你可以跟踪实现open()系统调用的linux函数(它叫做sys_open [可能])。 如果你陷入这个功能:

 $ dtrace -n fbt::sys_open: 

那么你必须查看内核源代码来查看arg0,arg1,arg2等等。 几乎可以肯定的是,Solaris或MacOS是它的Linux实现细节。

但是你可能想要访问一些参数,例如获取一些内部的内核数据结构(TCP,磁盘驱动程序,USB驱动程序等)。 Solaris提供了比“知道arg3是一个struct foo *”更高层访问数据结构的“提供者”。 没有这些提供者,脚本将是完全opsys依赖和没有可移植性。 大多数人并不关心“tcp”结构是什么样子,而是要访问关键字段,如pktin,pktout,rcvbytes,sndbytes。

总而言之, dtrace4linux和Solaris dtrace提供了一个可移植层来允许访问这些特性或结构,但dtrace4linux或Solaris都不会尝试完成一项完整的工作,以便在每个内核的数千个结构中提供可移植性。

一般来说,你可以使用solaris教程脚本,并用它们来试着理解什么是不起作用的,但是如果你不知道要找什么,试图按照原样使用它们会使你失望。

我认为dtrace4linux“不错”,“不够好”来隐藏这些差异。 (dtrace4linux与MacOS差不多 – 如果使用Solaris教程,有些可能无法在Mac或FreeBSD上运行)。