关于Ubuntu的DTrace,怎么做?

Jeo*_*hum 31 linux 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

小智 84

作为dtrace4linux的作者,让我回答一下.

本质上,Linux/MacOS/FreeBSD/Solaris上的dtrace是相同的 - 我们都基于具有相同目标的相同源代码.因为没有中央维护者,所以代码是有效的分支,Solaris被认为是主要代码.主要的源代码差异是每个平台的粘合剂.

DTrace是许多东西的组合:

  • 内核驱动程序
  • 用户空间"dtrace"命令
  • 探测功能机制(例如系统调用,fbt)
  • 脚本语言

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

$ dtrace -n syscall::open:
.....
Run Code Online (Sandbox Code Playgroud)

无论是谁执行它,都会捕获每个开放系统调用.如果您了解Unix,您知道系统调用大约是:

open(char *filename, int flags, [int perms])
Run Code Online (Sandbox Code Playgroud)

所以,arg0是字符串"filename".但这是事情不同的地方.C lib函数如上所述,但这映射到系统调用,类似于:

open(int someflags, char *filename, int userflags, int perms)
Run Code Online (Sandbox Code Playgroud)

因此文件名不在arg0中,而是在arg1中.(如果上述内容错误,请道歉 - 我认为open()在内核和用户空间中是相同的,但事实并非如此,例如对于stat()函数族).

这就是DTrace的一些"可移植性"问题出现的地方 - 如果您使用Solaris指南进行dtrace,并尝试运行某些脚本或示例,您可能会发现它们的工作方式不同.从理论上讲,这是Linux(我的)错误,应该修改dtrace4linux来隐藏它.

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

现在让我们来看看fbt.Fbt只是函数跟踪 - 任何函数 - 带有任何参数.您可以跟踪实现open()系统调用的linux函数(称为sys_open[可能]).如果您捕获此功能:

$ dtrace -n fbt::sys_open:
Run Code Online (Sandbox Code Playgroud)

那么你必须查看内核源代码,看看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上运行).

  • 所以需要一个功能,让我可以为超越的答案授予更多积分。谢谢。 (3认同)