我是靠谱客的博主 无奈山水,最近开发中收集的这篇文章主要介绍jprobe,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部