0

我正在尝试使用 kprobe 来跟踪handle_pte_faultlinux 内核中的函数调用。我可以探测handle_mm_fault,但是当我尝试探测时handle_pte_dault,kprobe 的处理程序handle_pte_fault不会打印任何内容。

使用这个我发现我无法探测一个内联的函数,也可能是静态的。所以,我改变了handle_pte_fault函数的定义如下并重新编译了内核。

从:

static int handle_pte_fault(struct vm_fault *vmf)

至:

noinline int handle_pte_fault(struct vm_fault *vmf)

我还添加了以下内容以确保handle_pte_fault符号存在

EXPORT_SYMBOL_GPL(handle_pte_fault);

我仍然无法跟踪/探测 handle_pte_fault 功能。任何帮助或解释。这是否意味着 kprobe 仅适用于某些随机函数?

我正在使用内核 v4.13。

下面是我正在使用的 kprobe 的内核模块代码:

#include<linux/module.h>
#include<linux/version.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/kprobes.h>

static struct kprobe kp;
static const char *probed_func = "handle_pte_fault";

static unsigned int counter = 0;

int Pre_Handler(struct kprobe *p, struct pt_regs *regs){
        printk("Pre_Handler: counter=%u\n",counter++);
        return 0;
}

void Post_Handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags){
        printk("Post_Handler: counter=%u\n",counter++);
}


int myinit(void)
{
        printk("module inserted\n ");

        kp.pre_handler = Pre_Handler;
        kp.post_handler = Post_Handler;
        kp.addr = (kprobe_opcode_t *)kallsyms_lookup_name(probed_func);

        register_kprobe(&kp);

        return 0;
}

void myexit(void)
{
        unregister_kprobe(&kp);
        printk("module removed\n ");
}

module_init(myinit);
module_exit(myexit);
MODULE_AUTHOR("User1");
MODULE_DESCRIPTION("KPROBE MODULE");
MODULE_LICENSE("GPL");
4

0 回答 0