官方文档,例子,练习
2 Tracing
(1)stap -L 'kernel.function("*nit")'
(3) 因为内联函数没有唯一的返回点,所以
probe kernel.function("*@net/socket.c").inline{
printf("%s -> %s\n",thread_indent(1),probefunc())
}
probe kernel.function("*@net/socket.c").return{
printf("%s <- %s\n",thread_indent(-1),probefunc())
}
不能返回整齐的调用与返回缩进排版。
3.使用systemtap获得某一系统调用的参数或返回值或频率.
获得参数:
cat > myopen_vars.stp
probe kernel.function("sys_open"){//这里也可以加.call的后缀。不加时,默认为.call
printf("%s\n",$$vars)
/*or printf("%s\n",$$parms) 使用vars 时输出多一个参数*/
}
vars = filename=0xb9e9024c flags=0x8000 mode=0x1b6 ret=0x5
parms = filename=0xb9e9024c flags=0x8000 mode=0x1b6
获得返回值
cat > myopen_return.stp
probe kernel.function("sys_open").return{/*注意,这里一定要有后缀。否则system的分析通不过*/
printf("%s\n",$$return)
}
此时返回的是地址。
如果使用printf("%d\n",$return)
则返回的是长整型数值。
$$打头的扩展为了字符串类型。$开头的是长整型
获得使用频率
cat > open_f.stp
global counts = 0/*注意count是系保留字,不能使用。所以用了counts*/
probe kernel.function("sys_open"){
printf("counts = %x\n",++counts)/*以十六进制显示*/
}