问题描述
我想在Ubuntu上使用DTrace。
https://github.com/dtrace4linux/linux
上面有一个用于Linux的github。
-
我想知道Linux的dtrace是否与其他OS(Solaris,FreeBSD,OSX)的dtrace相同。
-
我想找到一个使用它的教程(dtraceforlinux)。
-
我想知道下面的solaris dtrace教程是否适合我。
http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html
先感谢您。旅人
最佳方法
作为dtrace4linux的作者,让我回答。
本质上,Linux /MacOS /FreeBSD /Solaris上的dtrace是相同的-我们都基于相同的源代码,并且目标相同。因为没有中央维护者,所以代码实际上是派生的,而Solaris被视为主要代码。主要的源代码差异是每个平台的粘合剂。
DTrace是许多因素的组合:
-
内核驱动
-
用户空间”dtrace”命令
-
探测功能机制(例如syscall,fbt)
-
脚本语言
看一下syscall,它的追踪非常简单:
$ dtrace -n syscall::open:
.....
这会捕获每个打开的系统调用,无论是谁执行的。如果您知道Unix,则知道syscall大致为:
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的某些”portability”问题出现的地方-如果使用Solaris指南进行dtrace,并尝试运行某些脚本或示例,则可能会发现它们不起作用。从理论上讲,这是Linux(my)故障,应修改dtrace4linux以隐藏此故障。
所有这些都适用于syscall。
现在让我们看fbt。 Fbt只是函数跟踪-任何函数-具有任何参数。您可以跟踪实现open()
syscall的linux函数(其称为sys_open
[可能])。如果您捕获此函数:
$ dtrace -n fbt::sys_open:
那么您必须查看内核源代码才能看到arg0,arg1,arg2等。几乎可以肯定,它与Solaris或MacOS不同-它的Linux实现细节。
但是您可能希望访问某些参数,例如掌握一些内部内核数据结构(TCP,磁盘驱动器,USB驱动器等)。 Solaris提供”providers”,这是访问数据结构的高级方法,而不是知道“ arg3是’struct foo *’”。没有这些提供程序,脚本将完全依赖opsys,并且没有可移植性。大多数人不关心”tcp”结构是什么样子,但是想要访问pktin,pktout,rcvbytes,sndbytes等关键字段。
总之,dtrace4linux
和Solaris dtrace
提供了可移植层以允许访问这些功能或结构,但是dtrace4linux或Solaris均未尝试完成一项完整的工作以在每个内核中的数千个结构中提供可移植性。
通常,您可以使用solaris教程脚本并使用它们来尝试了解不起作用的内容,但是如果您不知道要查找的内容,尝试使用它们’as-is’将使您感到沮丧。
我认为dtrace4linux为”not bad”,“不够好”以掩盖这些差异。 (dtrace4linux与MacOS差不多-如果您使用Solaris教程,则某些教程可能不适用于Mac或FreeBSD)。