C 我们可以使用kprobes跟踪所有Linux内核函数吗

C 我们可以使用kprobes跟踪所有Linux内核函数吗,c,debugging,linux-kernel,trace,kprobe,C,Debugging,Linux Kernel,Trace,Kprobe,我阅读了以下关于kprobes的内容: Kprobes允许您为任何应用程序安装前置处理程序和后置处理程序 内核指令以及函数输入和函数返回 处理者 我正在尝试为“\u do\u sys\u open”函数注册kprobe $ sudo cat /proc/kallsyms | grep 'do_sys_open' ffffffff96ac0130 T do_sys_open 编写了一个注册kprobe的基本代码 #include <linux/kernel.h> #include &

我阅读了以下关于kprobes的内容:

Kprobes允许您为任何应用程序安装前置处理程序和后置处理程序 内核指令以及函数输入和函数返回 处理者

我正在尝试为“\u do\u sys\u open”函数注册kprobe

$ sudo cat /proc/kallsyms | grep 'do_sys_open'
ffffffff96ac0130 T do_sys_open
编写了一个注册kprobe的基本代码

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>

MODULE_LICENSE("GPL");

static struct kprobe kp;;
static char *name = "_do_sys_open";

static int pre_handler(struct kprobe *p, struct pt_regs *regs)
{
    return 0;
}

static void post_handler(struct kprobe *p, struct pt_regs *regs,
             unsigned long flags)
{
}

static int __init hello_init(void)
{
    /* set the handler functions */
    kp.pre_handler = pre_handler;
    kp.post_handler = post_handler;
    kp.symbol_name = name;
    return register_kprobe(&kp);
}

static void __exit hello_exit(void)
{
    unregister_kprobe(&kp);
}

module_init(hello_init);
module_exit(hello_exit);
这是否意味着此函数不能与kprobes一起使用

它也没有被列入黑名单

#cat/sys/kernel/debug/kprobes/blacklist | grep'(系统打开)

您的内核版本是什么?您的CPU体系结构是什么?Linux内核版本5.2,CPU体系结构:x86_64I可能缺少一些内容,但为什么在符号名称的开头有下划线?是否要跟踪
do_sys\u open
?这是问题还是打字错误?@Tsyvarev“模块中未知符号”是在模块插入失败且出现
enoint
错误时打印的。这不一定是因为动态链接错误。这可能是由于module init函数返回
-enoint
(如果
register\u kprobe
被赋予了一个不存在的符号名,则可能会出现这种情况!)。