SystemTap是一个系统的跟踪探测工具。它能让用户来跟踪和研究计算机系统在底层的实现。
安装SystemTap需要为你的系统内核安装-devel,-debuginfo,-debuginfo-common包
使用下面的repo可以进行debuginfo的安装
[debuggery]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
priority=1
需要理解下面几个名词:
instrumentation module -- 由SystemTap脚本编译的内核模块
host system -- 你编译instrumentation 模块的机器
target system -- 你运行instrumentation 模块的机器
target kernel -- target system的内核模块
你可以在一台机器上为其他机器编译trap模块,在目标机上只要安装systemtap-runtime,在宿主机上使用:
stap -r kernel_version script -m module_name
就能生成module_name.ko模块
然后在目标机上运行staprun module_name.ko就可以执行这个trap
stap命令参数:
-v
提供脚本运行的详细输出,可以使用多个的,比如stap -vv script.stp 输出的信息比stap -v script.stp多
-o filename
将输出存到文件filename中
-S size,count
限制输出的文件大小(兆byte算)和文件数目,多个文件会有后缀
-x process ID
这个processID能从脚本中的target()获取
-c 'command'
将target()函数做重命名
-e 'script'
使用script而不是文件作为输入
-F
使用Flight recorder mode(飞行记录模式),让脚本在后台运行。
我们也可以使用 - 来将标准输入作为stap的输入
echo "probe timer.s(1) {exit()}" | stap -
SystemTap的飞行模式
飞行模式使用-F参数控制的,它并不保存所有的输出,而是只保存最近一段时间的输出,保存的文件大小和文件数量是根据-S来控制的。
飞行模式的监控是运行在后台的。
安装出现问题:
missing x86_64 kernel/module debuginfo
根据这篇文章解决:http://dikar.iteye.com/blog/1477619
SystemTap是如何工作的
每个SystemTap脚本都会创建一个sesssion,这个session按照下面的执行顺序做操作:
1 SystemTap使用tapset库检查这个脚本
2 SystemTap将脚本翻译成C,然后在根据这个C程序生成一个内核模块。(在/tmp/xxxx/xxxx.ko)
3 SystemTap加载这个模块,然后将代码挂载到探针probes(events 和handlers)中
4 当事件发生的时候,相关的代码就执行了
5 当session结束的时候,探针就被销毁
SystemTap的事件可以被归类为两种类型:同步和异步
同步事件包括:
syscall.system_call
vfs.file_operation
kernel.function("function")
kernel.trace("tracepoint")
module("module").function("function")
异步事件包括:
begin
end
timer events
printf