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

概述

kretprobes 主要用于在函数返回时调用处理函数,主要用于调试函数的返回值,也可以用于计算函数运行占用的时间。
例如下例就是通过kretprobes来计算调用_do_fork 占用的时间

static char func_name[NAME_MAX] = "_do_fork";
module_param_string(func, func_name, NAME_MAX, S_IRUGO);
MODULE_PARM_DESC(func, "Function to kretprobe; this module will report the"
            " function's execution time");

/* per-instance private data */
struct my_data {
    ktime_t entry_stamp;
};

/* Here we use the entry_hanlder to timestamp function entry */
static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
    struct my_data *data;

    if (!current->mm)
        return 1;    /* Skip kernel threads */
//得到入口时的时间
    data = (struct my_data *)ri->data;
    data->entry_stamp = ktime_get();
    return 0;
}


static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
    unsigned long retval = regs_return_value(regs);
    struct my_data *data = (struct my_data *)ri->data;
    s64 delta;
    ktime_t now;
//得到函数出口时的时间,通过ktime_sub得到调用_do_fork的时间差
    now = ktime_get();
    delta = ktime_to_ns(ktime_sub(now, data->entry_stamp));
    pr_info("%s returned %lu and took %lld ns to executen",
            func_name, retval, (long long)delta);
    return 0;
}
//定义处理函数,当在函数入口是调用entry_handler,离开函数时调用handler。
static struct kretprobe my_kretprobe = {
    .handler        = ret_handler,
    .entry_handler        = entry_handler,
    .data_size        = sizeof(struct my_data),
    /* Probe up to 20 instances concurrently. */
    .maxactive        = 20,
};

static int __init kretprobe_init(void)
{
    int ret;

    my_kretprobe.kp.symbol_name = func_name;
//调用register_kretprobe 来在_do_fork的入口建立一个探测点
    ret = register_kretprobe(&my_kretprobe);
    if (ret < 0) {
        pr_err("register_kretprobe failed, returned %dn", ret);
        return -1;
    }
    pr_info("Planted return probe at %s: %pn",
            my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);
    return 0;
}

module_init(kretprobe_init)
module_exit(kretprobe_exit)

最后

以上就是时尚飞鸟为你收集整理的kretprobes的全部内容,希望文章能够帮你解决kretprobes所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部