
网站制作公司网站: 目标变量
本运行结束时
000个内核jiffy触发一次
续表
00毫秒触发一次,带有线性分布的随机附加时间(-50到+50)
除了这些内置事件以外,stap还有一些额外的函数提供。类似于其他编程语言的库的
概念,这些函数一般是由/usr/share/systemtap/tapset/目录下的近百个stp脚本提供的。
常见的函数如表1-5所示。
表1-5
事件类型
pid()
uid()
execname()
tid()
gettimeofday_s()
print_backtrace()
2.控制结构
)年1月
探针触发时刻
日0点0分至今的秒数
控制结构和awk很像,具体如表1-6所示。
表1-6 | |
语 句 | 说 明 |
if(exp) {} else {} | 标准的if-then-else语句 |
for (expl ; exp2 ; exp3 ) {} | 一个for循环 |
while (exp) {} | 标准的while循环 |
do {} while (exp) | 一个do-while循环 |
break | 退出迭代 |
contmue | 继续迭代 |
next | 从探针返回 |
retum | 从函数返回一个表达式 |
foreach(VAR in ARRAY) {} | 迭代一个数组,将当前的键分配给VAR |
在控制结构和探针进入目标之后,需要通过对应的变量来显示当前位置可见的变量
值。stap在这里会区分变量类型,如果是结构体,那么可以用->来查看其具体成员的值。
这个写法很像Perl中的散列取值。
通常有以下几个值是可读的。
◎ $$vars:打印probe点处的每个变量,类似下面这行语句的作用。
◎ $$locals:$$vars子集,仅打印local变量。
$$parms:$$vars子集,仅包含函数参数。
$$return:仅在return probes中存在,如果没有返回值,则是空串。类似下面这
样语句的作用。
sprintf f”retHrn-%x’’≯I$瑟辔鬻疆鹫缓莪薹囊曩蠢瑟曩譬量麓_曩曩曩:i_…囊∥。:一崔簟÷
注意,$$parms和$$locals输出的值是内存映射地址,效果如下。
# stap -e
exit () ; l'
probe kernel.function("vfs read") {printf("%s\n", $$parms);
file=Oxffff8800b40d4c80
af96df48
buf=Ox7fff634403eo count=Ox2004 pos-Oxffff8800-
通过这个可以看出具体有哪些变量名,但是其内容是看不到的,所以要在后面加一个
$,就可以看到具体的结构体成员和字符串了。
可以看出,file结构体的成员信息依然不明确。要彻底展开的话,再加一个$就可以了,
不过输出会受限于最大字符串的长度,效果如下。
# 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