查看源代码 SystemTap 和 Erlang/OTP

简介

SystemTap 是 Linux 上的 DTrace。实际上,Erlang 的 SystemTap 支持是使用 SystemTap 的 DTrace 兼容层构建的。有关 Erlang DTrace 支持的介绍,请阅读 $ERL_TOP/HOWTO/DTRACE.md

先决条件

  • 带有 UTRACE 支持的 Linux 内核

    检查您当前内核中的 UTRACE 支持

    # grep CONFIG_UTRACE /boot/config-`uname -r`
    CONFIG_UTRACE=y

    已知 Fedora 16 包含 UTRACE,对于大多数其他 Linux 发行版,将需要自定义构建内核。请查看 Fedora 的 SystemTap 文档以获取其他所需的软件包(例如,内核调试符号)

  • SystemTap > 1.6

    在编写本文时,SystemTap 的最新发布版本是 1.6 版。Erlang 的 DTrace 支持需要在此版本之后引入的宏。因此,要么获取较新的版本,要么自己从 git 构建 SystemTap(请参阅:http://sourceware.org/systemtap/getinvolved.html

构建 Erlang

配置并构建带有 SystemTap 支持的 Erlang

# ./configure --with-dynamic-trace=systemtap + whatever args you need
# make

测试

与 DTrace 不同,SystemTap 需要知道它正在跟踪哪个二进制文件,并且必须能够在开始跟踪之前读取该二进制文件。因此,您的探针脚本必须引用正确的 beam 模拟器,并且 stap 需要能够找到该二进制文件。这些示例是为“beam”编写的,但可能存在其他版本,例如“beam.smp”或“beam.debug.smp”(取决于您的配置)。请确保您在探针中指定了二进制文件的完整路径,或者您的“beam”二进制文件位于搜索路径中。

所有可用的探针都可以像这样列出

# stap -L 'process("beam").mark("*")'

# PATH=/path/to/beam:$PATH stap -L 'process("beam").mark("*")'

像这样在 dtrace.so NIF 库中的探针

# PATH=/path/to/dtrace/priv/lib:$PATH stap -L 'process("dtrace.so").mark("*")'

运行 SystemTap 脚本

调整 process("beam") 引用以匹配您的 beam 版本,并将脚本附加到正在运行的 "beam" 实例

# stap /path/to/probe/script/port1.systemtap -x <pid of beam>