我想在Ubuntu上使用DTrace。
https://github.com/dtrace4linux/linux
上面有一个用于Linux的github。
http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html
发布于 2013-01-17 22:34:48
作为“dtrace4linux”的作者,让我来回答。
本质上,Linux/MacOS/FreeBSD/Solaris上的dtrace是相同的--我们都基于相同的源代码,有着相同的目标。因为没有中央维护人员,所以代码实际上是分叉,Solaris被认为是主程序。主要的源代码差异是每个平台的胶水。
DTrace是一系列事物的组合:
看看syscall跟踪它非常简单:
$ dtrace -n syscall::open:
.....这会诱捕每个开放的系统调用,不管是谁执行的。如果您知道Unix,那么您就知道syscall大约是:
open(char *filename, int flags, [int perms])因此,arg0是字符串“文件名”。但这正是事情的不同之处。like函数与上面一样,但是它映射到一个系统调用,它类似于:
open(int someflags, char *filename, int userflags, int perms)所以文件名不是在arg0中,而是在arg1中。(如果上面说的是错误的话-我认为open()在内核和用户空间中是相同的,但事实并非如此,例如,对于stat()系列函数)。
这就是dtrace的“可移植性”问题出现的地方--如果您使用Solaris指南对DTrace进行操作,并尝试运行一些脚本或示例,您可能会发现它们不一样。从理论上讲,这是Linux (my)的错误,应该修改dtrace4linux来隐藏它。
所有这些都适用于系统。
现在让我们来看看fbt。Fbt只是函数跟踪-任何函数-任何参数。您可以跟踪实现open() syscall (可能称为sys_open )的linux函数。如果您捕获此函数:
$ dtrace -n fbt::sys_open:然后,您必须查看内核源代码,以了解什么是arg0、arg1、arg2等等。而且几乎可以肯定,它不同于Solaris或MacOS --它的实现细节。
但是您可能希望访问某些参数,例如获取某些内部内核数据结构(TCP、磁盘驱动程序、USB驱动程序等)。Solaris提供的“提供者”是访问数据结构的更高级别的方式,而不是知道"arg3是一个'struct *'“。没有这些提供程序,脚本将完全依赖于opsys,并且不具有可移植性。大多数人并不关心"tcp“结构是什么样子,而是想要访问关键字段,如pktin、pktout、tcp字节、but字节。
总之,dtrace4linux和Solaris dtrace提供了一个允许访问这些特性或结构的可移植层,但是dtrace4linux或Solaris都没有尝试完成一个完整的工作来提供每个内核中数千个结构的可移植性。
通常,您可以使用solaris教程脚本,并使用它们来尝试和理解哪些不工作,但是如果您不知道该寻找什么,尝试使用它们“as-is”会让您感到沮丧。
我认为dtrace4linux“不错”和“不够好”来掩盖这些差异。(dtrace4linux与MacOS差不多--如果您使用Solaris教程,有些可能无法在Mac或FreeBSD上工作)。
https://stackoverflow.com/questions/14375364
复制相似问题