首页 > Linux操作系统 > Linux操作系统 > systemtap基础入门
stap脚本最终会被解析成c语言并以内核模块的形式加载;
可运行于root用户,也可创建stapdev/stapusr用户组,运行非root用户运行systemtap;
Stapdev:其下用户可运行systemtap脚本,也可使用staprun运行SystemTap指令模块
Stapusr:其下用户只能使用staprun运行SystemTap指令模块
变量数值类型long -- 64位unsigned integer
字符串关联数组--
索引项可以是long或string;value值可以是统计数据;
遍历数组foreach( x in foo)--x为索引项
foreach([s,x] in foo- limit 10)--只取前10个
删除数组 delete arr
删除数组某个元素 delete arr[tid()]
统计数据--用于聚集操作,只支持<<<运算符,支持聚集函数@count()/@sum()/@min()/@max(),还支持图形显示hist_linear()/hist_log()
支持C语言的语法结构,包括if else/for(,,,)/while(expr)/do {} while(exp)
脚本参数$1..$N用于数字参数;@1..@N字符串参数;$#/@#参数个数
systemtap脚本分为2部分: probe函数和自定义函数
begin--脚本开始时执行
end--脚本结束时运行
error--因错误终结时运行
probe函数主要类型如下
timer类似定时器,即定时调用该探针,例如timer.s(10)每10秒运行一次
除了秒,还支持jiffies/ms/us/ns,而timer.profile则每个system tick运行一次;
内核函数使用kprobes和kretprobes,
其语法为kernel.function("FUNC@FILE:LINE")或module("NAME").function("FUNC@FILE:LINE")所有调用该函数的行为都能被探测,其中@FILE和:LINE为可选项;
还支持后缀:.call--默认,探测non-inlined函数;.inline--探测inlined函数;.return,探测non-inlined函数的返回
tapsets为自带函数库,提供一些预定义函数,位于/usr/share/systemtap/tapset,此目录在elaboration阶段会被扫描,也可-I指定其他目录;
syscall.* --探测每个system call,包括name和argstr
内置函数systemtap还有很多内置函数
上下文相关cpu()--执行当前进程的CPU number
execname()--返回当前执行的进程名
tid()pid()--当前进程的ID
uid()--当前进程的user id
stp_pid()backtrace()pp()thread_indent()--probefunc()--返回被探测的函数名
probemod()字符串相关strlen()/substr()/isinstr()/strtol()时间相关get_cycles()gettimeofday_s()gettimeofday_ns() 限制经过解析的脚本需运行于内核空间,而内核栈空间有限;为内核栈避免溢出和节省系统资源,会有以下限制:递归调用的深度数组大小--所有数组都是预分配的,如果太长则会抛出错误
执行时间--自动检测无限循环操作并终结,如while(1) {...}
其它诸如除0操作也会被及时检测
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-757901/ ,如需转载,请注明出处,否则将追究法律责任。