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 标记,这样当超过资源限制时,会有提示。

results matching ""

    No results matching ""