从kprobe获取参数找不到regs-> rdi x86_64

我在Scientific Linux 6.3 x86_64下编写了一个内核模块,我正在使用kprobes。 在这个模块中,我需要访问返回函数的第一个参数,所以jprobes不在了。

我发现这个非常有用的post: 使用kprobes获取函数参数

但是,当我尝试访问我的探针中的regs->rdi ,编译器会抱怨

 error: 'struct pt_regs' has no member named 'rdi' 

在我的模块初始化期间,我运行这个检查没有问题:

 #ifndef CONFIG_X86_64 printk(KERN_ALERT "Error: this module only supports x86_64!\n"); return -EINVAL; #endif 

还有什么我应该看? uname -r返回2.6.32-279.14.1.el6.x86_64.debug

这是一个MWE:

 #include <linux/module.h> #include <linux/kernel.h> #include <linux/kprobes.h> #include <linux/blkdev.h> static int kprobe_test(struct kprobe *p, struct pt_regs *regs) { printk(KERN_INFO "rdi: %p\n", regs->rdi); return 0; } static struct kprobe myprobe = { .pre_handler = NULL, .post_handler = kprobe_test, .fault_handler = NULL, .addr = (kprobe_opcode_t *) generic_make_request, }; int init_module(void) { register_kprobe(&myprobe); return 0; } void cleanup_module(void) { unregister_kprobe(&myprobe); } 

其结果是:

 ... /home/user/kmod/kprobe_64_mwe/kprobe_mwe.c:7: error: 'struct pt_regs' has no member named 'rdi' ... 

定义pt_reg时, __KERNEL__的定义会发生变化。 尝试使用di代替。