
網(wǎng)站制作公司網(wǎng)站: 目標變量
本運行結(jié)束時
000個內(nèi)核jiffy觸發(fā)一次
續(xù)表
00毫秒觸發(fā)一次,帶有線性分布的隨機附加時間(-50到+50)
除了這些內(nèi)置事件以外,stap還有一些額外的函數(shù)提供。類似于其他編程語言的庫的
概念,這些函數(shù)一般是由/usr/share/systemtap/tapset/目錄下的近百個stp腳本提供的。
常見的函數(shù)如表1-5所示。
表1-5
事件類型
pid()
uid()
execname()
tid()
gettimeofday_s()
print_backtrace()
2.控制結(jié)構(gòu)
)年1月
探針觸發(fā)時刻
日0點0分至今的秒數(shù)
控制結(jié)構(gòu)和awk很像,具體如表1-6所示。
表1-6 | |
語 句 | 說 明 |
if(exp) {} else {} | 標準的if-then-else語句 |
for (expl ; exp2 ; exp3 ) {} | 一個for循環(huán) |
while (exp) {} | 標準的while循環(huán) |
do {} while (exp) | 一個do-while循環(huán) |
break | 退出迭代 |
contmue | 繼續(xù)迭代 |
next | 從探針返回 |
retum | 從函數(shù)返回一個表達式 |
foreach(VAR in ARRAY) {} | 迭代一個數(shù)組,將當前的鍵分配給VAR |
在控制結(jié)構(gòu)和探針進入目標之后,需要通過對應的變量來顯示當前位置可見的變量
值。stap在這里會區(qū)分變量類型,如果是結(jié)構(gòu)體,那么可以用->來查看其具體成員的值。
這個寫法很像Perl中的散列取值。
通常有以下幾個值是可讀的。
◎ $$vars:打印probe點處的每個變量,類似下面這行語句的作用。
◎ $$locals:$$vars子集,僅打印local變量。
$$parms:$$vars子集,僅包含函數(shù)參數(shù)。
$$return:僅在return probes中存在,如果沒有返回值,則是空串。類似下面這
樣語句的作用。
sprintf f”retHrn-%x’’≯I$瑟轡鬻疆鷲緩莪薹囊曩蠢瑟曩譬量麓_曩曩曩:i_…囊∥。:一崔簟÷
注意,$$parms和$$locals輸出的值是內(nèi)存映射地址,效果如下。
# stap -e
exit () ; l'
probe kernel.function("vfs read") {printf("%s\n", $$parms);
file=Oxffff8800b40d4c80
af96df48
buf=Ox7fff634403eo count=Ox2004 pos-Oxffff8800-
通過這個可以看出具體有哪些變量名,但是其內(nèi)容是看不到的,所以要在后面加一個
$,就可以看到具體的結(jié)構(gòu)體成員和字符串了。
可以看出,file結(jié)構(gòu)體的成員信息依然不明確。要徹底展開的話,再加一個$就可以了,
不過輸出會受限于最大字符串的長度,效果如下。
# stap
exit () , I '
-e 'probe kernel.function("vfs read") {printf("%s\n", $$parms$$),
file= { . f_u- { . fu_list- { . next-Oxffff8 8 0}13 3 6caOe8,
}, .fu rcuhead={.next=Oxffff8801336caOe8