起初systemtap 是聚焦于核心空間的,因為使用者層的診斷工具真的很多,後來還是在0.6版本時候可以探測使用者程序了,既然可以用,那就用它吧。
Systemtap用uprobes 子產品來執行使用者層的探測,在核心3.5以後,已經包含了,可以檢視核心的config檔案中CONFIG_UPROBES參數。
1.
使用者層事件
使用者事件可以通過PID來限定,也可以通過可執行路徑來限定。
有些事件限制了必須使用一個特定的PATH,因為需要debug資訊來靜态分析将探針放在哪裡。
例如:
process(“PATH”).function(“function”),使用者空間函數入口。類似核心函數的kernel.function(“function”)。
process(“PATH”).statement(“statement”),類似kernel.statement(“statement”).
process(“PATH”).mark(“marker”),靜态點marker定義在PATH .很多應用提供靜态探針.例如java的hotspot JVM.
probe hotspot.gc_begin =
process("/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server/libjvm.so").mark("gc__begin")
process.begin,使用者程序開始建立
process.thread.begin,使用者線程建立
process.end使用者程序結束
process.thread.end使用者線程結束
process.syscall使用者程序使用系統調用。
2.
通路目标變量
對于每個函數,第一個參數是指向資料的
user_char(address) ,包含目前使用者程序中位址的位元組。此外還有如下,分别是短整型,整型,長整型,字元串。
user_short, user_int, user_long,
user_string, user_string_n
3.
使用者空間堆棧
探針指針probe point(pp)可以顯示是那個事件觸發了事件句柄。
但是共享庫函數經常被程式不同子產品激活,是以函數堆棧就可以看到事件是如何被觸發的。
使用者層堆棧,通過調試資訊段來實作的,不過對于可執行程式需要使用-d executable參數,共享庫需要-ldd參數。
#stap -d /bin/ls --ldd -e 'probe
process("ls").function("xmalloc")
{print_usyms(ubacktrace())}' -c "ls /"