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

Kprobe无法探测handle_pte_fault函数的问题及内核修改尝试

解决Kprobe无法探测handle_pte_fault函数的问题

我之前也碰到过一模一样的情况:用Kprobe追踪Linux内核里的handle_pte_fault时,对应的处理函数完全没输出,但探测handle_mm_fault却一切正常。折腾了一阵后,终于找到问题根源和解决办法,分享给你:

问题根源

Kprobe是通过挂钩函数的入口指令来实现探测的,但如果目标函数是静态(static)函数或者被编译器做了内联(inline)优化,编译器会直接把函数代码嵌入到调用它的地方,不会保留独立的函数入口地址。handle_pte_fault默认是static int handle_pte_fault(struct vm_fault *vmf),既属于静态函数,又大概率被编译器内联了,这就导致Kprobe找不到可以挂钩的点,自然不会触发处理函数。

解决步骤

我是这么操作解决的:

  1. 找到内核源码中handle_pte_fault的定义(通常在mm/memory.c文件里);
  2. 修改函数定义:把static int handle_pte_fault(struct vm_fault *vmf)改成noinline int handle_pte_fault(struct vm_fault *vmf)——noinline会强制编译器跳过内联优化,去掉static则让函数全局可见,确保Kprobe能定位到它的入口;
  3. 按照常规流程重新编译内核、安装并启动新内核;
  4. 重新部署Kprobe探测handle_pte_fault,这时候处理函数就能正常输出探测结果了。

内容的提问来源于stack exchange,提问作者psin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:10:29