我们知道stap命令的-l(或-L)选项可以列出指定的某个probe描述中所有符合的probe点的列表,例如可以使用下面的命令,看到所有可以probe的函数:
stap
-l
'kernel.function("*")'
今天在看书的时候,突然想到可以利用这个选项来找到一些内核函数的定义,例如sys_open()的定义。不管是source insight还是vim+ctag+cscope+taglist这样的组合看代码时,如果要想找到某个系统调用的定义,都需要在工程里搜索,因为这些系统调用在定义的时候都是用SYSCALL_DEFINE0、SYSCALL_DEFINE1等这样的宏来定义的,这些工具都没法直接找到其准确定义的位置。但是现在我们可以利用stap命令的-l选项,先准确地找到其具体的位置,然后精确地去某个文件的某一行就可以找到,非常快捷方便。下面就以sys_open()为例来演示这个过程。
1、找到具体的位置
命令和输出如下:
[root@CentOS____190
~]
# stap -l 'kernel.function("sys_open")'
kernel.function( sys_open@fs/open.c:913)
kernel.function( sys_open@fs/open.c:913)
如下所示:
上面的步骤只是一个思路,如果想进一步简化的话,可以直接写一个脚本,每次只需要输入要查找的函数名称就行了,避免做重复的劳动。