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));
}