kprobe处理程序没有被触发特定功能

时间:2018-01-12 07:39:45

标签: linux linux-kernel kernel-module kprobe

我试图使用kprobes拦截模块下面的函数。为此函数传递了“register_kprobe”,但在调用函数时没有触发Kprobe处理程序。

如果我在探测函数中打印函数地址,奇怪的是它开始工作(kprobe处理程序被调用)。它也适用于内核中的其他函数。

为什么kprobe处理程序没有被触发,打印函数地址有什么不同?

系统在x86_64上安装了3.10内核。

不工作代码:

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 个答案:

答案 0 :(得分:1)

你没有提供调用func的代码。

最有可能发生的事情是,他编译器在呼叫站点内联主体,并且添加引用地址会说服它生成全身并调用它。通过拆卸应该很容易检查。

然而,实际问题总是一样的:你在做什么?