stap
stap 是 SystemTap 的命令行工具,它会把脚本语言编译成内核模块然后运行。脚本可以通过命令行运行,也可以保存到文件运行。
stap -e
可以运行命令行脚本stap test.stp
可以运行脚本文件
脚本会一直运行直到下面情况发生:
- 用户手动结束,输入
Ctrl+C
- 脚本执行到 exit 函数
- 脚本产生足够多的软件错误
- 使用
-c
指定的命令结束运行,脚本也结束
stap 主要功能如下:
- 翻译脚本语言
- 生成编译成内核模块
- 加载模块,运行,把输出打印到控制台
- 运行结束时,卸载模块
介绍几个 stap 常用的命令参数:
-v
输出更详细的信息-l
输出匹配的探针, 比如输出系统调用可用的探针
stap -l 'syscall.*'
-L
输出匹配的探针和本地变量, 比如输出系统调用可用的探针及可以使用的变量
stap -L 'syscall.*'
资源限制
stap 需要管理员权限才能运行,它公开了内核的数据结构及私有的用户信息。在使用时,需要前面加上 sudo 命令。
handler 会编译成 module 运行在内核层面,为了防止 handler 运行太长时间,或者申请大量的内存,或者执行不安全的操作,甚至干扰内核运行,会有一系列的资源限制。这些限制是通过宏定义的,可以使用 -D 来覆盖当前的宏定义。
- MAXNESTING 函数递归调用的最大深度, 默认值为10
- MAXSTRINGLEN 字符串的最大长度。在32位机器上是256字节,其余的为512字节
- MAXTRYLOCK 等待全局变量锁的最大迭代次数,超过此限制会被认为死锁,并会调过当前 probe 执行。 默认值为1000
- MAXACTION 在当个 probe 中执行的最长语句数。默认值为1000
- MAXMAPENTRIES 数组最大的行数,默认值为2048
- MAXERRORS 允许脚本执行的最多软件错误,超过此错误,脚本会终止, 默认值为0
- MAXSKIPPED 跳过折返 probe 的最大数量,超过此数量,脚本终止,默认值为100, 不是很理解,之前也没有遇到过
- MINSTACKSPACE 运行 handler 所需要的最小的内核栈空间(字节),默认值为1024
使用 stap 时,尽量加上 -v
标记,这样当超过资源限制时,会有提示。