1. 查看函数参数的方法
直接使用 $变量名即可。
probe kernel.function("do_mmap_pgoff")
printf("%s(%d) %s (%s)\n",execname(),pid(),$pgoff,$len)
}
2. 查看结构体成员变量
直接结构体变量名->成员名即可,如
probe kernel.statement("fb_mmap@drivers/video/fbmem.c:1357")
{
printf("%s(%d) %x\n",execname(),pid(),$info->node)
}
如果结构体是void指针,则需要使用@cast接口进行强制转换,如
struct fb_info {
...
void *par;
...
}
probe kernel.statement("fb_mmap@drivers/video/fbmem.c:1357")
{
p = @cast($info->par, "struct psb_fbdev")->pfb
printf("%s(%d) %d\n",execname(),pid(),p)
}
如果还要继续访问其中的void指针指向的成员,则需要继续进行类型转换,如
probe kernel.statement("fb_mmap@drivers/video/fbmem.c:1357")
{
p = @cast(@cast($info->par, "struct psb_fbdev")->psb_fb_helper->dev->dev_private, "struct drm_psb_private")->pg->stolen_size
printf("%s(%d) %d\n",execname(),pid(),p)
}
3. 查看函数参数及返回结果
probe process("./test").function("testB").return {
printf("arg:%s ret:%s\n",$$parms, $$return$)
}
4. 编写自定义函数
%{
#include <linux/netdevice.h>
%}
private function show_dev:string(skb:long) %{
struct sk_buff *skb;
struct net_device *dev;
skb = (struct sk_buff *)STAP_ARG_skb;
dev = skb->dev;
if (dev)
STAP_RETURN(dev->name);
else
STAP_RETURN("unknown");
%}
probe kernel.function("__netif_receive_skb_core").label("drop"){
printf("0x%04X, net is: %s\n", ntohs($skb->protocol), show_dev($skb));
}