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 execute\n",
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 %d\n", ret);
return -1;
}
pr_info("Planted return probe at %s: %p\n",
my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);
return 0;
}
module_init(kretprobe_init)
module_exit(kretprobe_exit)
kretprobes相关推荐
- kprobes/kretprobes 在 bcc 程序中的使用
1. kprobes/kretprobes 介绍 1.1 kprobes 介绍 kprobes 主要用来对内核进行调试追踪, 属于比较轻量级的机制,,本质上是在指定的探测点(比如函数的某行, 函数的入 ...
- linux 内核 调试工具介绍
1 内核调试以及工具总结 内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试. 内核的调试, 其本质是内核空间与用 ...
- linux 系统调用 hook 总结
1. 系统调用Hook简介 系统调用属于一种软中断机制(内中断陷阱),它有操作系统提供的功能入口(sys_call)以及CPU提供的硬件支持(int 3 trap)共同完成. 我们必须要明白,Hook ...
- linux系统调用挂钩方法总结
相关学习资料 http://xiaonieblog.com/?post=121 http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing- ...
- 使用BPF跟踪Linux内核
1. 前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试.与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序 ...
- bcc Reference Guide 中文翻译
bcc Reference Guide 文章目录 bcc Reference Guide BPF C Events & Arguments 1.kprobes 2.kretprobes 3.T ...
- Linux系统调用Hook姿势总结
相关学习资料 http://xiaonieblog.com/?post=121 http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing- ...
- ebpf深入理解和应用介绍
1. ebpf概述 1.1 ebpf发展历史 BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间 ...
- Linux/Documentations: Kernel Livepatching
Linux/Document: Livepatch_RToax-CSDN博客Livepatch - The Linux Kernel documentationhttps://www.kernel.o ...
最新文章
- java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...
- PHP算法对获取用,连接的字符串用in进行sql查询的php处理方法
- 华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓
- TensorFlow教程之API DOC 6.3.10. NN
- node.js如何制作命令行工具(一)
- 2019年美赛B题思路详解
- 用Python+Appium自动写网课考试
- 共享OrCAD9.2pSpice9.2+multisim下载地址
- 高级软件测试人员考核指标,软件测试人员绩效考核详细-20210406011350.docx-原创力文档...
- GNSS常用术语(缩略语)总结------------持续更新
- 修改内网服务器数据,内网服务器拷数据
- android build.versioncodes.kitkat,Android 4.1至4.4 KitKat-为API启用TLS 1.2
- 心流——微妙的人际关系
- #4258. 铃铛计数问题
- [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度
- Maven的基本原理和Maven2的新特性
- php销售清单录入界面,列表,表格,商品清单表,注册表单的用法 2019年8月31日
- 手机有NFC模拟卡的功能,原因有哪些呢?
- 大型企业网络系统集成方案如何设计?
- 用途相似的标签:cite,q与blockquote