Kernel 3.x中Kretprobe处理器无法触发的问题求助
CentOS 7 3.10内核下kretprobe无法触发sys_getdents64的排查方案
一、理清sys_getdents64与SyS_getdents64的差异
在3.10内核x86_64架构中:
sys_getdents64是通用系统调用入口,SyS_getdents64是x86_64架构特定别名,二者实际指向同一函数,但需确认系统实际调用的入口。
二、确认系统调用实际触发的入口
- 执行
strace ls,观察getdents64对应的内核函数调用,明确实际触发的符号。 - 查看内核符号表:
cat /proc/kallsyms | grep getdents64,确认sys_getdents64的符号类型(需为T/t,即代码段符号)。
三、验证kretprobe挂载的正确性
- 查看已注册探针:
cat /sys/kernel/debug/kprobes/list,核对挂载地址与/proc/kallsyms中sys_getdents64的地址是否一致。 - 检查符号可见性:安装内核-devel包后执行
nm vmlinux | grep getdents64,若符号为小写t(静态符号),则kprobe无法直接探测,因为静态符号未导出为全局可见。
四、排查系统调用执行路径的绕过情况
CentOS 7 3.10内核中部分系统调用可能通过vDSO等机制绕过sys_*入口:
- 检查vDSO参与情况:
ldd /bin/ls | grep vdso,再用strace -e trace=getdents64 -v ls查看调用细节,确认是否走内核系统调用入口。 - 尝试探测底层函数:若
sys_getdents64被绕过,可替换为探测filldir64(getdents64内部调用的目录项填充函数),该函数调用更底层,不易被绕过。
五、代码与日志层面检查
- 核对handler函数签名:3.10内核的kprobe handler参数与5.x/6.x存在细微差异,确保
entry_handler和ret_handler的参数符合内核要求。 - 调整日志级别:执行
dmesg -n 7临时提升日志级别,同时确保printk使用KERN_INFO及以上级别,避免日志被过滤。
内容的提问来源于stack exchange,提问作者Jelal
相关产品推荐
相关产品推荐

