kprobe(内核探测,kernel probe)是一个动态地收集调试和性能信息的工具。
如,收集寄存器和全局数据结构等调试信息,无需对Linux内核频繁编译和启动。
用户可以在任何内核代码地址进行陷阱,指定调试断点触发时的处理例程。
工作机制是:
用户指定一个探测点,并把用户定义的处理函数关联到该探测点,当内核执行到该探测点时,相应的关联函数被执行,然后继续执行正常的代码路径。
kprobe允许用户编写内核模块添加调试信息到内核。
用户可以编译一个内核模块,并将内核模块插入到调试的内核中,就可以输出所需要的调试信息了。
内核探测分为kprobe, jprobe和kretprobe(也称return probe,返回探测)三种。kprobe可插入内核中任何指令处;jprobe插入内核函数入口,方便于访问函数的参数;return probe用于探测指定函数的返回值。
内核模块的初始化函数init安装(或注册)了多个探测函数,内核模块的退出函数exit将注销它们。注册函数(如:register_kprobe())指定了探测器插入的地方、探测点触发的处理例程。
配置支持kprobe的内核
配置内核时确信在.config文件中设置了CONFIG_KPROBES、CONFIG_MODULES、CONFIG_MODULE_UNLOAD、CONFIG_KALLSYMS_ALL和CONFIG_DEBUG_INFO。
调试文件系统debugfs含有kprobe的调试接口,可以查看注册的kprobe列表,还可以关闭/打开kprobe。
查看系统注册probe的方法列出如下,样例输出,
#cat /debug/kprobes/list
c015d71a k vfs_read+0x0
c011a316 j do_fork+0x0
c03dedc5 r tcp_v4_rcv+0x0
第一列表示探测点插入的内核地址,第二列表示内核探测的类型,k表示kprobe,r表示kretprobe,j表示jprobe,第三列指定探测点的"符号+偏移";如果被探测的函数属于一个模块,模块名也被指定;
打开和关闭kprobe的方法列出如下,
#echo ‘1’ /debug/kprobes/enabled
#echo ‘0’ /debug/kprobes/enabled
在cygwin仿真环境输个命令看一下;仿真环境无法进行此操作;
要配置内核时在.config文件中设置了CONFIG_KPROBES才能使用此功能;看一下cygwin安装目录,没有任何的系统配置的相关文件;
通过基本的了解可知,可以自己编写代码来实现probe;linux系统是否提供自带的一些probe还不了解;先初步了解一下;