C 我们可以使用kprobes跟踪所有Linux内核函数吗
我阅读了以下关于kprobes的内容: Kprobes允许您为任何应用程序安装前置处理程序和后置处理程序 内核指令以及函数输入和函数返回 处理者 我正在尝试为“\u do\u sys\u open”函数注册kprobeC 我们可以使用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 &
$ 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
被赋予了一个不存在的符号名,则可能会出现这种情况!)。