檢視原始碼 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 支援需要一個在該版本之後引入的 MACRO。因此,請取得較新的版本或從 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>