简介

动态追踪技术通常是基于操作系统内核来实现的。是一种调试技术。

作用

用于排查线上出现的诡异问题,如网站运行缓慢、超时、CPU占用率高

优点

  1. 动态追踪技术一般是不需要目标应用来配合的。
  2. 自身的性能损耗极小

DTrace

DTrace 是一个非常通用的调试平台,它提供了一种很像 C 语言的脚本语言,叫做 D。基于 DTrace 的调试工具都是使用这种语言编写的。

优势:

它采取了跟操作系统内核紧密集成的一种方式。

缺点:

1. D 语言缺乏循环结构
2. DTrace 对于用户态代码的追踪支持比较弱,没有自动的加载用户态调试符号的功能,需要自己在 D 语言里面声明用到的用户态 C 语言结构体之类的类型。

SystemTap

SystemTap 是由 Red Hat 公司的工程师创建的较为独立的动态追踪框架。SystemTap 提供了自己的一种小语言,和 D 语言并不相同。

SystemTap 是目前 Linux 世界功能最强大,同时也是最实用的动态追踪框架。

优点:

它有非常成熟的用户态调试符号的自动加载,同时也有循环这样的语言结构可以去编写比较复杂的探针处理程序,可以支持很多很复杂的分析处理。

缺点:

1. 首先,它并不是 Linux 内核的一部分,就是说它并没有与内核紧密集成,所以它需要一直不停地追赶主线内核的变化。
2. 另一个缺点是,它通常是把它的“小语言”脚本(有点像 D 语言哦)动态编译成一个 Linux 内核模块的 C 源码,因此经常需要在线部署 C 编译器工具链和 Linux 内核的头文件。出于这些原因,SystemTap 脚本的启动相比 DTrace 要慢得多,和 JVM 的启动时间倒有几分类似。

无论是 DTrace 还是 SystemTap,其实都不支持编写完整的调试工具,因为它们都缺少方便的命令行交互的原语。 所以我们才看到现实世界中许多基于它们的工具,其实最外面都有一个 Perl、Python 或者 Shell 脚本编写的包裹。