檢視原始碼 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>