最近学习system tap的一些使用,虽然目前还是对于linux内核学习还是很菜的菜鸟,作为处女作,希望大家多喷,欢迎交流指错。参考资料来源http://www.sourceware.org/systemtap/documentation.html
systemtap简介
system tap是一种检查内核运行情况的工具,它允许开发者和管理员编写和重新使用简单脚本深入检查一个正在运行的linux系统的活动。可以快速安全地提取、筛选、总结相关活动的数据,来诊断分析linux内核复杂的性能或者函数功能问题。
systemtap脚本的重要思想是指定事件(events系统活动或者内核函数执行),然后当这些事件触发的时候,需要编写对这些事件进行处理的处理程序(handlers)。其实根据这个systemtap的思想,我就先提出自己的一点见解,要指定事件,你要做的就是对内核有一定的了解,这里更多的涉及内核代码层次的了解多一点,针对处理程序,我们要做的更多的是对systemtap脚本的了解,当然针对我们需要查询的数据,你同样需要掌握内核函数的某些参数。总之,你需要学好linux内核,再来用systemtap就能很好的发挥它的功能作用。
这里列举几种事件,函数的调用和退出,计时器到期,整个systemtap会话开始或者停止等等。处理程序就是语言脚本的一系列声明,这些声明的作用就是当事件发生时,处理程序需要做的工作,一般工作包括从事件执行的上下文中提取数据,用处理程序的内部变量存储这些数据,或者打印出这些数据。
systemtap的工作过程:
1 .将systemtap脚本翻译成C语言
2,用C语言编译器将上述C语言代码编译成一个内核模块
3.当这个模块被加载,通过钩子函数,它会把所有的探测事件
4.当事件被处理器执行,被编译的处理程序就会运行。最终,当会话结束,钩子函数就会分离,模块也会被移除。
probe definitions
probe PROBEPOINT [,PROBEPOINT] { [STMT ...] }
在上述定义中,探测点(PROBEPOINT)是以一种systemtap脚本语法用来指定事件(events)。在翻译器(translator)中定义了几种探测(PROBEPOINT),在tapset库里面用别名(aliases)也定义了其他的一些探测点。当任何有探测点(PROBEPOINT)指定的事件发生时,STMT语句块就会被执行。
根据每个事件的上下文翻译解释探针处理程序。因为事件与内核代码相关,所以这些上下文可能包括在相关内核源代码中定义的变量。这些被称为目标变量(上下文变量)可以作为变量提供给systemtap脚本,但是这些目标变量访问的时候需要加前缀$。当然这些目标变量只有在编译器编译内核的时候没有被优化,而是保存下来才能被访问。
PS:名词解释
Tapset库:类似于C库,systemtap建立了一个脚本库供大家使用,一个”tapset”就是一个为了复用而设计的脚本,通过安装到一个指定的目录下,缺省情况下的目录是/usr/share/systemtap/tapset.大家可以用vi编辑器直接访问某些脚本函数,进一步了解systemtap机制。
别名(aliases):使用别名,可以定义新的探测点(PROBEPOI