Skip to content

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

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

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

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

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

运行之后报下面的错:

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

Avatar

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

Sidebar