快速说五遍:strace、ptrace、dtrace、dtruss
这篇博文最初是我对 Unix 命令的又一次深入研究(还记得吗?),其中我深入探讨了一个常见 Linux 命令的内部原理。当时我正试图运行程序strace
来确定我正在探索的命令所调用的系统调用,这时我突然想起我使用的是 macOS,而 macOS 没有这个strace
工具,而是使用了一个叫做 的工具dtruss
来跟踪程序执行过程中调用的系统调用。
strace
之前我对它和之前的区别一无所知dtruss
。我只知道它能dtruss
完成我需要它做的事情,并没有花太多心思去研究它的具体工作原理和它到底是什么。
但是今天是揭开无知外衣的日子,朋友们!
什么是 strace?
strace
它是一个系统调用跟踪器,也是科技界为数不多的几个名字与其功能相符的东西之一。你可能对strace
Julia Evans 的Strace Zine很熟悉。我觉得 Julia 的 Zine 是了解 Strace 的好方法,strace
但我还是想总结一下 Strace 的两点。
- 系统调用是一种接口,允许程序向操作系统请求某些功能。这些系统调用可以执行诸如更改当前工作目录、更改文件权限等操作。您可以在此处查看完整的系统调用列表。
strace
列出程序执行时调用的系统调用。
本杂志没有深入探讨其strace
底层工作原理。我将在这里深入探讨。底层利用strace
了ptrace
(进程跟踪)系统调用,它允许父进程监视和控制子进程的执行。它用于strace
,但它也支持调试器之类的功能gdb
。ptrace
系统调用使用一些 Linux 内部数据结构在跟踪器(父进程)和被跟踪进程(子进程)之间建立关系。每当在被跟踪进程中调用系统调用时,跟踪器都会收到系统调用的通知,并且被跟踪进程将暂时停止。此时,ptrace
无论是strace
还是gdb
,正在调用 的程序都将处理有关它收到通知的系统调用的信息,然后将控制权返回给子进程。在子进程、ptrace 和更高级别程序之间来回切换凸显了 的缺点之一strace
。由于操作系统必须在多个进程之间反复切换上下文,strace
因此速度并不快。
总之,充当正在运行的进程和更高级别工具(如或 )ptrace
之间的中介。gdb
strace
什么是 dtrace?
现在,我不得不做一些研究。我找到的第一个定义dtrace
是在Brendan Gregg 的网站上,它将dtrace
(或者我猜可以称之为 DTrace)定义为“动态跟踪的一种实现”。什么是动态跟踪?我费了好大劲才找到一个能很好地解释这一点的资源。最后,我偶然发现了这篇文章,它帮助我理解了发生了什么。
依赖strace
于ptrace
内省进程,dtrace
而 则处理方式略有不同。使用dtrace
,程序员可以使用一种语法类似 C 语言的语言(称为 D)编写探测器。这些探测器定义了dtrace
在调用系统调用、退出函数或其他任何您想要的操作时应该执行的操作。这些探测器存储在一个脚本文件中,如下所示。
syscall::read:entry {
printf("read has been called.");
}
该脚本规定,每当read
系统调用被调用时,跟踪器都应该打印出字符串“read has been called”。然后使用 dtrace 调用该脚本文件,如下所示。
$ dtrace -s my_probe.d
dtrace
然后,每当探测器运行到探测器中列出的事件(进入某个系统调用或退出某个函数等等)时,就会调用探测器中的逻辑。这种灵活性使 DTrace 被称为动态跟踪器。
什么是 dtruss?
接下来我要揭开的真相是,truss 到底是什么dtruss
。我遇到的第一个定义来自dtruss
手册页,它被定义dtruss
为“DTrace 版本的 truss”。好吧,我想我最好先弄清楚 truss 是什么。事实证明,truss
它是一个 Unix 特有的命令,允许用户打印出程序发出的系统调用。它本质上是strace
Linux 上已有工具的一个变体。了解了这一点,我认为描述它的最佳方式是打个比方:strace
is 到dtrace
as truss
is 到 as is dtruss
。
还有哪些其他追踪工具?
现在,事实证明,strace
和dtrace
并不是我们追踪器工具包中仅有的工具。我的研究最终引导我探索更广阔的追踪器世界。结果,Julia 再次拯救了我。Brendan Gregg 发表了另一篇博客文章,列出了不同的 Linux 追踪器、它们的工作原理以及何时可以使用它们。Brendan 似乎是这个领域的权威人物,他出版过几本关于追踪的书籍,也写过很多精彩的博客文章。如果你有兴趣深入了解,我推荐你看看他的一些博客文章。
结论
嗯,这真是一次有趣的“滑向冰山”之旅。当你一开始只是提出一个简单的问题(strace 和 DTrace 有什么区别),最终却发现了更大的东西(一个全新的跟踪器世界)时,总是很有趣的。
您经常使用什么追踪工具?有没有哪个追踪工具是您特别喜欢的?