我想在Ubuntu上使用DTrace。
https://github.com/dtrace4linux/linux
上面有一个用于Linux的github。
http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html
提前谢谢你。 Journeyer
答案 0 :(得分:82)
作为dtrace4linux的作者,让我回答。
本质上,Linux / MacOS / FreeBSD / Solaris上的dtrace是相同的 - 我们都基于具有相同目标的相同源代码。因为没有中央维护者,所以代码是有效的分支,Solaris被认为是主要代码。主要的源代码差异是每个平台的粘合剂。
DTrace是许多内容的组合:
查看系统调用跟踪它非常简单:
$ 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上运行。)