kprobe не работает для некоторых функций

Я пытаюсь использовать kprobe для отслеживания handle_pte_fault вызовы функций в ядре Linux. Я могу прощупать 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");

0 ответов

Другие вопросы по тегам