linux 5.4 使用kretprobe 获取探测函数参数
时间: 2024-01-08 18:04:44 浏览: 38
使用 kretprobe 获取探测函数的返回值和参数,需要进行以下步骤:
1. 定义一个 kretprobe 结构体,并填充相关字段,如被探测函数名、处理函数等。
2. 在处理函数中,获取探测函数的返回值和参数,并进行相应的处理。
3. 在模块初始化函数中,注册 kretprobe。
下面是一个示例代码,用于获取函数 `printk` 的参数:
```c
#include <linux/module.h>
#include <linux/kprobes.h>
static struct kretprobe kp;
static int handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk(KERN_INFO "printk called with arg1=%lx arg2=%lx arg3=%lx\n",
regs->di, regs->si, regs->dx);
return 0;
}
static int __init my_init(void)
{
kp.handler = handler;
kp.kp.symbol_name = "printk";
if (register_kretprobe(&kp) < 0) {
printk(KERN_ERR "register_kretprobe failed\n");
return -1;
}
printk(KERN_INFO "my_init: kretprobe registered\n");
return 0;
}
static void __exit my_exit(void)
{
unregister_kretprobe(&kp);
printk(KERN_INFO "my_exit: kretprobe unregistered\n");
}
module_init(my_init)
module_exit(my_exit)
MODULE_LICENSE("GPL");
```
在上面的代码中,我们定义了一个 kretprobe 结构体 `kp`,并将其处理函数设置为 `handler`。在 `handler` 函数中,我们通过 `regs` 参数获取了 `printk` 函数的参数,并使用 `printk` 函数将其打印出来。
在模块初始化函数 `my_init` 中,我们将 `kp` 注册到内核中,并指定被探测的函数名为 `printk`。如果注册失败,则返回错误。在模块退出函数 `my_exit` 中,我们将 `kp` 从内核中注销。最后,我们通过 `MODULE_LICENSE` 宏声明了该模块的许可证类型。