查看源代码 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>