欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

SystemTap工具的使用基础

发布时间:2025/7/14 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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工具的使用基础的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。