You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$stap -ve 'probe begin { log("hello systemtap!") exit() }'
如果安装正确,会得到如下类似的输出结果:
Pass 1: parsed user script and 96 library script(s) using 55100virt/26224res/2076shr/25172data kb, in 120usr/0sys/119real ms.
Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 55496virt/27016res/2172shr/25568data kb, in 0usr/0sys/4real ms.
Pass 3: translated to C into "/tmp/stapYqNuF9/stap_e2d1c1c9962c809ee9477018c642b661_939_src.c" using 55624virt/27380res/2488shr/25696data kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_e2d1c1c9962c809ee9477018c642b661_939.ko" in 1230usr/160sys/1600real ms.
Pass 5: starting run.
hello systemtap!
Pass 5: run completed in 0usr/10sys/332real ms.
示例二:打印4s内所有open系统调用的信息
创建systemtap脚本文件test2.stp:
#!/usr/bin/stap
probe begin
{
log("begin to probe")
}
probe syscall.open
{
printf ("%s(%d) open (%s)\n", execname(), pid(), argstr)
}
probe timer.ms(4000) # after 4 seconds
{
exit ()
}
probe end
{
log("end to probe")
}
什么是systemtap
假如现在有这么一个需求:需要获取正在运行的 Linux 系统的信息,如我想知道系统什么时候发生系统调用,发生的是什么系统调用等这些信息,有什么解决方案呢?
下面将会介绍systemtap的安装、systemtap的工作原理以及几个简单的示例。
systemtap 的安装
我的主机 Linux 发行版是32位 Ubuntu13.04,内核版本 3.8.0-30。由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。
下面我以两种方式安装并运行 systemtap:
方法一
我们重新编译内核让其支持systemtap,首先你想让内核中有调试信息,编译内核时需要加上 -g 标志;其次,你还需要在配置内核时将 Kprobe 和 debugfs 开关打开。最终效果是,你能在内核 .config 文件中看到下面四个选项是设置的:
配置完之后,按照之前你编译内核的步骤编译即可。
从此地址 https://sourceware.org/systemtap/ftp/releases/ 下载已经发布的systemtap的源代码,截至目前(2013.9.17)最新版本为systemtap-2.3。下载完之后解压。
当然你还可以使用 git 去克隆最新的版本(2.4),命令如下:
如果你下载的是最新版本的systemtap,那么你需要新版的 elfutils,可以从 https://fedorahosted.org/releases/e/l/elfutils/ 下载elfutils-0.156 版本。下载之后解压缩到适合的目录(我放在~/Document/ 下),不需要安装,只要配置systemtap时指定其位置即可。
进入之前解压systemtap的目录,使用下面命令进行配置:
以这里方法配置之后,你只需要再运行 make install 即完成systemtap的编译安装。如果需要卸载的话,运行 make uninstall。
方法二
由于发行版的内核默认无内核调试信息,所以我们还需要一个调试内核镜像,在 http://ddebs.ubuntu.com/pool/main/l/linux/ 找到你的内核版本相对应的内核调试镜像(版本号包括后面的发布次数、硬件体系等都必须一致),如针对我上面的内核版本,就可以用如下命令下载安装内核调试镜像:
一般这种方法下,你只需要使用apt在线安装systemtap即可:
当然方法二仅限于Ubuntu发行版,至于其他的发行版并不能照搬,网上也有很多相关的资料。
systemtap 测试示例
安装完systemtap之后,我们需要测试一下systemtap是否能正确运行:
示例一:打印hello systemtap
以root用户或者具有sudo权限的用户运行以下命令:
如果安装正确,会得到如下类似的输出结果:
示例二:打印4s内所有open系统调用的信息
创建systemtap脚本文件test2.stp:
将该脚本添加可执行的权限
chmod +x test2.stp
,使用./test2.stp
运行该脚本,即可打印4s内所有open系统调用的信息,打印格式为:进程名(进程号)打开什么文件。大家可以自行去测试,如果两个示例都能正确运行,基本上算是安装成功了!
systemtap 工作原理
systemtap 的核心思想是定义一个事件(event),以及给出处理该事件的句柄(Handler)。当一个特定的事件发生时,内核运行该处理句柄,就像快速调用一个子函数一样,处理完之后恢复到内核原始状态。这里有两个概念:
Systemtap 工作原理是通过将脚本语句翻译成C语句,编译成内核模块。模块加载之后,将所有探测的事件以钩子的方式挂到内核上,当任何处理器上的某个事件发生时,相应钩子上句柄就会被执行。最后,当systemtap会话结束之后,钩子从内核上取下,移除模块。整个过程用一个命令
stap
就可以完成。上面只是简单的原理,更多背后的机理参考网上资料和相应的论文。
图 systemtap 处理流程
更多参考
The text was updated successfully, but these errors were encountered: