systemtap使用指导三

Tapsets(函数库)


4.1自动选择

systemtap企图去分解对全局标识符(探针,函数,变量)的引用(他们不是在脚本中定义的,)Systemtap attempts to resolve references to global symbols (probes, functions, variables) that are not defined within the script by a systematic search through the tapset library for scripts that define those symbols.

tapset库安装在默认的目录中(/usr/share/systemtap/tapset)。使用者可以通过-I DIR选项来增加其他的目录。systemtap会去这些目录中查找脚本文件(以.stp为后缀)。


这个检索的过程会覆盖子目录。这些子目录在不同的内核版本或者架构中会有不同。自然,这种查找是从特殊到一般的。

stap -p1 -vv(两个v) -e 'probe begin{}' > /dev/null

显示出你的系统可以用哪些tapset中提供的.stp文件。


当一个脚本文件被发现,整个文件都会被加入正在分析的探针会话中。查找会一直继续指导没有更多的引用被满足。如果systemtap还没有被解决就会发出出错信号。


这种机制保证了几种编程习惯。第一,它允许一些全局标识符只被适用的内核版本或者架构定义,如果有不适用的主机试图适用这些标识符就会报错。简单来说,相同的标志可以依据内核的不同而多次定义。

4.2探针的指针别名。

探针的指针允许从存在的探针中创建新的探针的指针。如果想死你的探针指针被用来做更高层次的抽象这就很有用。例如,系统调用tapset库中就低层次的kernel.function("sys_open"),使用syscall.open的形式定义了探针指针别名。如果以后的内核把sys_open的名字改了,也保证这个别名syscall.open可以使用。


定义探针指针别名和定义一个指针类似。都以关键字probe开始,并且以探针处理函数体作为结束。但是,普通的探针只是列出它的探测点,一个别名却是使用赋值符号“=”新建了一个名字。


4.3内嵌C

有的时候,一个tapset需要提供的来自内核的数值,不能通过使用一般的目标变量的形式($var)。因为可能这个值是个复杂的结构体,也可能是因为需要lock awareness,或者是因为是用宏定义的值。systemtap提供了一个“escape hatch”比使用这个语言更安全的方式。在一些上下文中,你可以将简单的c语句插入到tapset中去。

终端用户脚本也许不含有内嵌的c语句,除非systemtap使用了-g("guru"模式)的选项。

嵌入式c语言可以是一个脚本函数的函数体。此时函数体不能使用{},而是使用%{ %}。任何嵌入的c语言都会被逐句翻译到内核模块中去,它的安全性和正确性程序员自己保证。为了获得参数,并得到返回值,可以使用STAP_ARG_* 和 STAP_RETVALUE.我们知道的数据收集的函数pid(),execname(),以及类似的函数都是内嵌的c函数。

这里有一些安全相关的约束,当使用内嵌c时,应该遵守。

1.不要对未知的指针进行解引用。

2.不要调用会引起睡眠或者错误的内核例程。

3.当心可能的不良的递归,你的内嵌c函数调用的例程,这个例程可能是探针的对象。如果那样的探针处理函数调用了你的内嵌的c函数,你可能要遭遇无限的递归。类似的问题也发生在不可重用的锁上。

4。如果必须要对一个数据结构上锁,就是用trylock。即是上锁不成功,也不会阻塞。


4.4 命名习惯

使用刚刚描述的tapset搜索机制,许多脚本都可以在一个单独的回话中被使用。这就可能引起名字冲突的问题,因为不同的tapsets可能使用了相同的名称来称呼函数或者全局变量。从而在翻译或者运行的时候引起错误。


1.使用一个唯一的名字来命名你的tapset

2.如何可能冲突,就给你的标识符加一个前缀 YOURNAME_。

3.给所有的探针指针函数加一个前缀。

4.给你的内部标识符加一个前缀_ _YOURNAME_


http://sourceware.org/systemtap/tutorial/Tapsets.html#SECTION00053000000000000000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值