Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 获取一个函数';s在kretprobe处理程序中返回值_Linux Kernel_Kernel_Probe_Kprobe - Fatal编程技术网

Linux kernel 获取一个函数';s在kretprobe处理程序中返回值

Linux kernel 获取一个函数';s在kretprobe处理程序中返回值,linux-kernel,kernel,probe,kprobe,Linux Kernel,Kernel,Probe,Kprobe,我想知道是否有可能将kretprobe挂接到内核函数上,并在kretprobe的返回处理程序中捕获它的返回值。这是一个有点老的问题,但对于那些仍在寻找答案的人来说 如何注册kretprobe,您可以在kprobes()的文档中看到 一个独立于体系结构的函数,用于从系统调用中捕获ret值: #include <linux/ptrace.h> ... int hook_retcode(struct kretprobe_instance *ri, struct pt_regs *reg

我想知道是否有可能将kretprobe挂接到内核函数上,并在kretprobe的返回处理程序中捕获它的返回值。

这是一个有点老的问题,但对于那些仍在寻找答案的人来说

如何注册kretprobe,您可以在kprobes()的文档中看到

一个独立于体系结构的函数,用于从系统调用中捕获ret值:

#include <linux/ptrace.h>

...

int hook_retcode(struct kretprobe_instance *ri, struct pt_regs *regs)
{
    unsigned long retval = 0;

    retval = regs_return_value(regs);

    if (is_syscall_success(regs))
    {
        printk("%pf exited with a code %#lx\n", ri->rp->kp.addr, retval);
    }
    else
    {
        printk("%pf failed with a code %#lx\n", ri->rp->kp.addr, retval);
    }
}
#包括
...
int hook_retcode(结构kretprobe_实例*ri,结构pt_regs*regs)
{
无符号长检索=0;
retval=regs\u返回值(regs);
if(is_syscall_success(regs))
{
printk(“%pf退出,代码为%#lx\n”,ri->rp->kp.addr,retval);
}
其他的
{
printk(“%pf失败,代码为%#lx\n”,ri->rp->kp.addr,retval);
}
}

kprobe文档(
documentation/kprobes.txt
内核源代码)和它引用的kretprobe示例(
samples/kprobes/kretprobe\u example.c
)有什么问题?它没有提到捕获返回值的任何内容,是吗?行
int-retval=regs\u return\u value(regs)ret\u处理程序中的code>捕获返回值。您可以通过函数的描述和变量的名称来猜测。