快速说五遍:strace、ptrace、dtrace、dtruss

2025-06-08

快速说五遍:strace、ptrace、dtrace、dtruss

这篇博文最初是我对 Unix 命令的又一次深入研究(还记得吗?),其中我深入探讨了一个常见 Linux 命令的内部原理。当时我正试图运行程序strace来确定我正在探索的命令所调用的系统调用,这时我突然想起我使用的是 macOS,而 macOS 没有这个strace工具,而是使用了一个叫做 的工具dtruss来跟踪程序执行过程中调用的系统调用。

strace之前我对它和之前的区别一无所知dtruss。我只知道它能dtruss完成我需要它做的事情,并没有花太多心思去研究它的具体工作原理和它到底是什么。

但是今天是揭开无知外衣的日子,朋友们!

什么是 strace?

strace它是一个系统调用跟踪器,也是科技界为数不多的几个名字与其功能相符的东西之一。你可能对straceJulia Evans 的Strace Zine很熟悉。我觉得 Julia 的 Zine 是了解 Strace 的好方法,strace但我还是想总结一下 Strace 的两点。

  • 系统调用是一种接口,允许程序向操作系统请求某些功能。这些系统调用可以执行诸如更改当前工作目录、更改文件权限等操作。您可以在此处查看完整的系统调用列表。
  • strace列出程序执行时调用的系统调用。

本杂志没有深入探讨其strace底层工作原理。我将在这里深入探讨。底层利用straceptrace(进程跟踪)系统调用,它允许父进程监视和控制子进程的执行。它用于strace,但它也支持调试器之类的功能gdbptrace系统调用使用一些 Linux 内部数据结构在跟踪器(父进程)和被跟踪进程(子进程)之间建立关系。每当在被跟踪进程中调用系统调用时,跟踪器都会收到系统调用的通知,并且被跟踪进程将暂时停止。此时,ptrace无论是strace还是gdb,正在调用 的程序都将处理有关它收到通知的系统调用的信息,然后将控制权返回给子进程。在子进程、ptrace 和更高级别程序之间来回切换凸显了 的缺点之一strace。由于操作系统必须在多个进程之间反复切换上下文,strace因此速度并不快。

总之,充当正在运行的进程和更高级别工具(如或 )ptrace之间的中介gdbstrace

什么是 dtrace?

现在,我不得不做一些研究。我找到的第一个定义dtrace是在Brendan Gregg 的网站上,它将dtrace(或者我猜可以称之为 DTrace)定义为“动态跟踪的一种实现”。什么是动态跟踪?我费了好大劲才找到一个能很好地解释这一点的资源。最后,我偶然发现了这篇文章,它帮助我理解了发生了什么。

依赖straceptrace内省进程,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 特有的命令,允许用户打印出程序发出的系统调用。它本质上是straceLinux 上已有工具的一个变体。了解了这一点,我认为描述它的最佳方式是打个比方:straceis 到dtraceas trussis 到 as is dtruss

还有哪些其他追踪工具?

现在,事实证明,stracedtrace并不是我们追踪器工具包中仅有的工具。我的研究最终引导我探索更广阔的追踪器世界。结果,Julia 再次拯救了我。Brendan Gregg 发表了另一篇博客文章,列出了不同的 Linux 追踪器、它们的工作原理以及何时可以使用它们。Brendan 似乎是这个领域的权威人物,他出版过几本关于追踪的书籍,也写过很多精彩的博客文章。如果你有兴趣深入了解,我推荐你看看他的一些博客文章。

结论

嗯,这真是一次有趣的“滑向冰山”之旅。当你一开始只是提出一个简单的问题(strace 和 DTrace 有什么区别),最终却发现了更大的东西(一个全新的跟踪器世界)时,总是很有趣的。

您经常使用什么追踪工具?有没有哪个追踪工具是您特别喜欢的?

好奇者的链接

鏂囩珷鏉ユ簮锛�https://dev.to/captainsafia/say-this- Five-times-fast-strace-ptrace-dtrace-dtruss-3e1b
PREV
冠状病毒期间学习编码的指南 冠状病毒:在线学习者指南
NEXT
JavaScript 中的 Array.flat()