天天看點

systemptap系列之使用者空間探針 1.   使用者層事件 2.   通路目标變量 3.   使用者空間堆棧

起初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 /"