关于Ubuntu的DTrace,怎么做?

时间:2013-01-17 09:00:30

标签: 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

1 个答案:

答案 0 :(得分:82)

作为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 lib函数如上所述,但这映射到系统调用,类似于:

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

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

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

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

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

$ 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上运行。)