参考文档: https://sourceware.org/systemtap/tapsets/
一、一些常用的写法 #
1# 查看可以追踪的列表
2=> stap -l 'kernel.trace("*")' | grep kfree_skb
3kernel.trace("skb:kfree_skb")
4# 编译stap脚本并运行
5=> stap --all-modules test.stp
1. 开源的一些脚本 #
https://github.com/zengxiaobai/systemtap-scripts.git
二、语法 #
1. 内置变量 #
$location
: 当前所在的内存地址$$parms
: 字符串形式,当前函数参数和地址
2. 内置函数 #
symname($location)
: 当前所在函数symdata($location)
: 当前所在函数和偏移pid()
: 当前所在进程pidtarget()
: 由-x
指定的数据,一般是pid
三、实战 #
1) 查看包释放函数 #
- 每隔5s打印调用丢包函数的函数
1# 定义全局变量
2global locations
3
4# 设置开启和结束
5probe begin { printf("Monitor begin\n") }
6probe end { printf("Monitor end\n") }
7
8# 追踪kfree_skb函数
9probe kernel.trace("kfree_skb") {
10 # 将当前位置对应的变量+1
11 locations[$location] <<< 1
12}
13
14probe timer.sec(5) {
15 printf("\n")
16 foreach (l in locations-) {
17 printf("%d packets dropped at %s\n",
18 @count(locations[l]), symname(l)
19 )
20 }
21 delete locations
22}
- 输出
Monitor begin
1 packets dropped at ip_rcv_finish
1.4. 环境搭建 #
1) CentOS #
- 需要安装下面的包
1yum install gcc systemtap-devel
- 想要调试内存的malloc和free,就要配置debuginfo源,然后安装
1yum debuginfo-install glibc