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中(默认输出到控制台)