systemtap基礎入門

myownstars發表於2013-04-07
stap指令碼最終會被解析成c語言並以核心模組的形式載入;
可執行於root使用者,也可建立stapdev/stapusr使用者組,執行非root使用者執行systemtap
 
Stapdev:其下使用者可執行systemtap指令碼,也可使用staprun執行SystemTap指令模組
Stapusr:其下使用者只能使用staprun執行SystemTap指令模組
 
 
變數
數值型別long -- 64unsigned integer
字串
關聯陣列--
索引項可以是longstringvalue值可以是統計資料;
遍歷陣列
foreach( x in foo)--x為索引項
foreach([s,x] in foo- limit 10)--只取前10
刪除陣列 delete arr
刪除陣列某個元素 delete arr[tid()]
 
統計資料--用於聚集操作,只支援<<<運算子,支援聚集函式@count()/@sum()/@min()/@max(),還支援圖形顯示hist_linear()/hist_log()
 
支援C語言的語法結構,包括if else/for(,,,)/while(expr)/do {} while(exp)
 
指令碼引數
$1..$N用於數字引數;@1..@N字串引數;$#/@#引數個數
 
 
systemtap指令碼分為2部分: probe函式自定義函式
begin--指令碼開始時執行
end--指令碼結束時執行
error--因錯誤終結時執行
 
probe函式主要型別如下
timer
類似定時器,即定時呼叫該探針,例如timer.s(10)10秒執行一次
除了秒,還支援jiffies/ms/us/ns,而timer.profile則每個system tick執行一次;
 
核心函式
使用kprobeskretprobes
其語法為
kernel.function("FUNC@FILE:LINE")
module("NAME").function("FUNC@FILE:LINE")
所有呼叫該函式的行為都能被探測,其中@FILE:LINE為可選項;
還支援字尾:.call--預設,探測non-inlined函式;.inline--探測inlined函式;.return,探測non-inlined函式的返回
 
tapsets
為自帶函式庫,提供一些預定義函式,位於/usr/share/systemtap/tapset,此目錄在elaboration階段會被掃描,也可-I指定其他目錄;
syscall.* --探測每個system call,包括nameargstr
 
內建函式
systemtap還有很多內建函式
上下文相關
cpu()--執行當前程式的CPU number
execname()--返回當前執行的程式名
tid()
pid()--當前程式的ID
uid()--當前程式的user id
stp_pid()
backtrace()
pp()
thread_indent()--
probefunc()--返回被探測的函式名
probemod()
字串相關
strlen()/substr()/isinstr()/strtol()
時間相關
get_cycles()
gettimeofday_s()
gettimeofday_ns()
 
限制
經過解析的指令碼需執行於核心空間,而核心棧空間有限;
為核心棧避免溢位和節省系統資源,會有以下限制:
遞迴呼叫的深度
陣列大小--所有陣列都是預分配的,如果太長則會丟擲錯誤
執行時間--自動檢測無限迴圈操作並終結,如while(1) {...}
其它諸如除0操作也會被及時檢測
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-757901/,如需轉載,請註明出處,否則將追究法律責任。