Обработчик kprobe не запускается для определенной функции

Пытаюсь перехватить ниже функцию в модуле, используя kprobes. "register_kprobe" передан для этой функции, но обработчик Kprobe не запускается при вызове функции.

Странно это начинает работать (вызывается обработчик kprobe), если я печатаю адрес функции внутри функции исследования. Это работает и для других функций в ядре.

Почему обработчик kprobe не запускается и чем отличается адрес функции печати?

В системе установлено ядро ​​3.10 на платформе x86_64.

Не работает код:

int race;
void test_increment()
{
    race++;
    printk(KERN_INFO "VALUE=%d\n",race);
    return;
}

Рабочий код:

int race;
void test_increment()
{
    race++;
    printk(KERN_INFO "test_increment address: %p\n", test_increment);
    printk(KERN_INFO "VALUE=%d\n",race);
    return;
}

вызывающий func (он зарегистрирован как обратный вызов для записи в файл debugfs):

   static ssize_t write_conf_pid(struct file *file, const char *buf,
                size_t count, loff_t *position)
    {
        char temp_str[STRING_MAX];
        int ret;

        if (copy_from_user(temp_str, buf, STRING_MAX) != 0)
            return -EFAULT;

        /* NEVER TRUST USER INPUT */
        if (count > STRING_MAX)
            return -EINVAL;

        test_increment();
        return count;
    }

функция kprobe:

kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL);
kp->post_handler = exit_func;
kp->pre_handler = entry_func;
kp->addr = sym_addr;
ret = register_kprobe(kp);

Благодарю.

1 ответ

Решение

Вы не предоставили код вызова функции.

Скорее всего, это происходит из-за того, что компилятор вводит тело на месте вызова, и добавление priting адреса убеждает его генерировать полное тело и вместо этого вызывать его. Должно быть легко проверить разборкой.

Однако актуальный вопрос всегда один и тот же: что ты делаешь?

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