从kprobe获取args没有找到regs-> rdi x86_64

时间:2013-01-08 18:24:48

标签: linux kernel kprobe

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

我发现这个非常有用的帖子:Getting function arguments using 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’
...

1 个答案:

答案 0 :(得分:2)

定义pt_reg__KERNEL__的定义会发生变化。请尝试使用di