SystemTap工具的使用基础
systemtap工具的安裝
準備工作
uname -a
查看當前內核版本是哪一個,然后使用
yum install kernel-devel
安裝kernel debuginfo包
rpm -qi kernel-devel
找到內核構建的詳細信息,然后去對應發布網站上找kernel-debuginfo和kernel-debuginfo-common包。
安裝systemtap包
yum install systemtap
測試
完成安裝后可以通過下面命令測試systemtap
stap -ve ‘probe begin { print(“hello world\n”) exit()}’
進行測試,看看systemtap有無安裝成功。
systemtap常規命令
查看某個函數可以查看的target變量
下面命令演示查看__lookup_hash()函數返回時刻可以查看到的變量
stap -ve ‘probe kernel.function(“__lookup_hash”).return’ //查看__lookup_hash()函數返回時刻可以systemtap工具可以查看的target變量。
kernel.function(“__lookup_hash@fs/namei.c:1383”).return $return:struct dentry* $name:struct qstr* $base:struct dentry* $flags:unsigned int $need_lookup:bool
在上表中顯示了lookup_hash在文件中的行號,顯示了名為$return 的變量,其實這個return變量就是systemtap表示函數返回值的。而$name,$base,$flag我們對著linux源碼看發現這是__lookup_hash的三個入參。
下面命令可以查看__lookup_hash函數入口可以查看的變量
stap -L ‘probe kernel.function(__lookup_hash)’
使用systemtap打印目標函數的變量
systemtap支持print()和printf()函數,其中printf使用語法和c語言一致。支持%s,%d,%x格式
常用變量
| $$locals | 探測點上所有的本地變量(含參數) | n/a |
| $$parms | 探測點上函數的參數 | n/a |
| $$returns | 探測點上所有的返回值 | 只對return probe生效 |
變量的顯示方式
在systemtap里凡是以$開頭的變量都是目標變量,如果目標變量結構體指針或者結構體對象,那么可以使用->直接訪問其成員。例如上例中:
$return->d_inode //就是__lookup_hash()返回值dentry* 的d_inode成員的值。
常規情況下,printf()打印target變量時刻,只打印其值。如果需要將其成員(指針類型的target需要將其指向的對象的成員展開)可以在target變量后面加$的方式例如:
$return$ //顯示返回值指向的dentry所有成員。
一般情況下對struct的展開只會到成員值一級,如果相對成員內部繼續展開可以在目標變量后面跟$$
if邏輯語句
在systemtap中支持邏輯if語句格式為:
if (expr) {
語句
}
邏輯語句支持以下比較
==,!=,>=,>,<,<=
例子
下面例子將打印__lookup_hash中return返回dentry*里inode指向的i_ino子成員
stap -ve ‘probe kernel.function(“__lookup_hash”).return { if (return!=-2) { if (return,$return->d_inode->i_ino)}}}}’ -o zxy.txt
這一例子中-o zxy.txt的意思就是將結果寫入文件zxy.txt中(默認輸出到控制臺)
總結
以上是生活随笔為你收集整理的SystemTap工具的使用基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: J2Cache 中使用 Lettuce
- 下一篇: c++之趣味new代码大家看