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");

Какое значение возвращается при вызове register_kprobe()? Это должен быть индикатор того, была ли установка kprobe успешной или нет.

Tsyvarev 26.03.2018 09:01

Да, всегда следует проверять возвращаемое значение register_kprobe. Кроме того, вы также можете проверить, вернул ли kallsyms_lookup_name правильный адрес handle_pte_fault. Кроме того, обратите внимание на сообщения в dmesg после загрузки модуля. Если там есть сообщения об ошибках, это может помочь понять, что происходит не так.

Eugene 26.03.2018 10:15

Это действительно работает, я делал ошибки при перезагрузке, используя более старый скомпилированный образ. Как только я перезагружаюсь с правильным изображением, он работает нормально. Спасибо за помощь.

psin 28.03.2018 02:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
728
0

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