You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:04:52