概述
jprobe 主要用于调试函数传入的参数。其测试代码路径在kernel/samples/jprobe_example.c 中
下面这个例子会用j_do_for来替换_do_fork,这样当用户调用_do_fork的时候,就会调用j_do_fork,这样我们在j_do_fork就可以将调用_do_fork的参数打印出来,然后在通过jprobe_return 返回j_do_fork,继续调用_do_fork
所以jprobe 主要用于被探测的函数入口处。在jprobe的处理函数最后一定要调用jprobe_return来继续调用被探测函数.
所以jprobe的处理函数和被探测的函数行参应该是一样的,无论被探测的函数是通过栈传递参数还是通过寄存器传递参数,jprobe都可以探测到
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>
static long j_do_fork(unsigned long clone_flags, unsigned long stack_start,
unsigned long stack_size, int __user *parent_tidptr,
int __user *child_tidptr, unsigned long tls)
{
pr_info("jprobe: clone_flags = 0x%lx, stack_start = 0x%lx "
"stack_size = 0x%lxn", clone_flags, stack_start, stack_size);
/* Always end with a call to jprobe_return(). */
jprobe_return();
return 0;
}
//定义探测函数和处理函数
static struct jprobe my_jprobe = {
.entry = j_do_fork,
.kp = {
.symbol_name = "_do_fork",
},
};
static int __init jprobe_init(void)
{
int ret;
//注册jprobe
ret = register_jprobe(&my_jprobe);
if (ret < 0) {
pr_err("register_jprobe failed, returned %dn", ret);
return -1;
}
pr_info("Planted jprobe at %p, handler addr %pn",
my_jprobe.kp.addr, my_jprobe.entry);
return 0;
}
static void __exit jprobe_exit(void)
{
unregister_jprobe(&my_jprobe);
pr_info("jprobe at %p unregisteredn", my_jprobe.kp.addr);
}
module_init(jprobe_init)
module_exit(jprobe_exit)
最后
以上就是无奈山水为你收集整理的jprobe的全部内容,希望文章能够帮你解决jprobe所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复