searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Systemtap常规使用方法

2025-04-15 01:50:31
2
0

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

5. 更多使用说明请查看 systemtap官方文档。

0条评论
作者已关闭评论
GuoJin
7文章数
0粉丝数
GuoJin
7 文章 | 0 粉丝
原创

Systemtap常规使用方法

2025-04-15 01:50:31
2
0

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

5. 更多使用说明请查看 systemtap官方文档。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0