Skip to content

systemtap中访问内核函数参数中的指针

最近在排查一个文件系统相关的lock contention的问题。通过前面的排查,已经确定遇到的性能问题是lock contention导致,但却不知道究竟是哪些文件或资源导致的。

试着用ftrace,发现它无法看到内核函数调用的参数,而我们的系统还是3.10.0-1062 的内核(CentOS 7.7),bpftrace也无法使用。于是就学习了一下systemtap的用法。

我感兴趣的函数是link_path_walk(),它的原型是:

static int link_path_walk(const char *name, struct nameidata *nd) {}

确定了我要kernel.function追踪点。 经过快速学习之后 ,决定用@var(“name”)来试一下。 于是写出了下面的程序(我只对p4d这个可执行程序感兴趣):

probe kernel.function("link_path_walk") {
    if (execname() == "p4d") {    
            printf ("%d --> %s\n",pid(),@var("name")) 
               }
     }

运行之后报下面的错:

semantic error: type mismatch: expected string but found long: operator '@var' at dentry.stp:4:56
         source: if (execname() == "p4d") {      printf ("%d --> %s\n",pid(),@var("name")) }

name这个参数本来是个指针,但是systemtap却认为它是个“long(长整型)”,自然无法获取它的值,又试了用‘*’来取指针的值,就像在C语言中那样,结果systemtap不吃这一套。又试了@var(“name@fs/dcache.c”),依然不行。最后在这个邮件列表的归档网站中有人说要用kernel_string(),试了一下,果然可行。

probe kernel.function("link_path_walk") {
    if (execname() == "p4d") {    
            printf ("%d --> %s\n",pid(),kernel_string($name)) 
               }
     }
[root@example-server ~]# stap -v dentry.stp
Pass 1: parsed user script and 474 library scripts using 271964virt/69260res/3472shr/65936data kb, in 480usr/90sys/518real ms.
Pass 2: analyzed script: 1 probe, 4 functions, 3 embeds, 0 globals using 430924virt/229460res/4716shr/224896data kb, in 1380usr/1530sys/2672real ms.
Pass 3: using cached /root/.systemtap/cache/0b/stap_0b6ad90870157bff287048375a82a6f8_3075.c
Pass 4: using cached /root/.systemtap/cache/0b/stap_0b6ad90870157bff287048375a82a6f8_3075.ko
Pass 5: starting run.
6726 --> rdb.lbr
6721 --> rdb.lbr
6710 --> rdb.lbr
6705 --> .
6705 --> .
6705 --> .
6705 --> /opt/perforce/journals/live_journal
6705 --> /opt/perforce/journals/live_journal
6705 --> /opt/perforce/journals/live_journal
6705 --> tmp.6705.448912
6705 --> tmp.6705.448912
6705 --> tmp.6705.448912
6705 --> tmp.6705.448912
6705 --> state
Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar