linux kprobe 例子,Linux kprobe初探

本文介绍了kprobe作为一种轻量级内核调试工具的实现原理及优势,并通过bcc工具使用实例展示了kprobe的工作流程。

最近学习bcc-tools工具的使用,发现单单会使用还是不行,必须了解到其深层次的原理,所以使用该工具的时候,加了-v指令,分析了下bcc的调用流程,大致如下:

^CTraceback (most recent call last):

File"./funclatency", line 211, in b.attach_kretprobe(event_re=pattern, fn_name="trace_func_return")

File"/usr/lib/python2.7/site-packages/bcc/__init__.py", line 645, inattach_kretprobefor line inBPF.get_kprobe_functions(event_re):

File"/usr/lib/python2.7/site-packages/bcc/__init__.py", line 525, inget_kprobe_functions

(t, fn)= line.rstrip().split()[1:3]

从内容来看,采用的kprobe探测功能实现,下面就简短介绍下kprobe的实现原理,后面到bcc熟悉的差不多后再结合bcc相关代码讲其是怎么通过kprobe实现的。

kprobe作为轻量级内核调试工具,在诊断内核bug时有着先天独厚的优势,相关其他工具,kprobe有如下优点:

1、不用更新内核

2、可以以模块的形式加载进内核,用完后直接卸载即可,不会对内核造成污染

3、动态跟踪,自由构造,灵巧轻便。

kprobe实现原理:

原汁原味可以查看kernel doc:Documentation/kprobes.txt建议在分析其原理时,一定要看下,此外还可以参考 samples/kprobes编写kprobe探测驱动。

kprobe实现原理还是容易理解的,在调用跟踪函数前,插入kprobe指令至此执行pre_handler,例如通过软中断方式,进入单步调试,此时执行原先代码本该执行的指令,执行完成后返回会再次进入kprobe状态,执行post_handler,执行完成后再次从异常状态返回到代码顺序执行。从上面描述可知kprobe的实现机制其实就是在被探测的函数前后打点,执行到该点时,进入异常状态,使的程序暂停执行,去执行kprobe相关处理函数,执行完成后又再次从异常状态恢复到正常执行,此过程执行主要涉及到对EIP/SIP等相关寄存器的操作。

kprobe实现步骤:

注册kprobe:register_kprobe,此处关键是需要实现如下三个函数:pre_handler、post_handler和fault_handler

初始化kprobe:init_kprobe,和驱动的编写一样,实例化结构体,调用内核函数初始化

实现中断处理函数:跟踪一个函数的目的是什么。

如何让内核支持kprobe

CONFIG_KPROBES

CONFIG_MODULES:kprobe是按照驱动的形式加入进入内核的,所以支持驱动加载和卸载时最基本的

CONFIG_MODULE_UNLOAD

CONFIG_KALLSYMS:设置CONFIG_KALLSYMS_ALL为y将更好,此处主要让kprobe可以跟踪的内核函数kprobe。

原文:https://www.cnblogs.com/haoxing990/p/12116569.html

### eBPF与kprobe简介 eBPF (Extended Berkeley Packet Filter) 是一种强大的技术,允许安全地执行沙盒程序来增强 Linux 功能[^1]。最初用于网络过滤,现在已扩展到支持各种用例,包括性能分析、安全性以及内核跟踪。 Kprobes 提供了一种动态调试机制,在不修改源码的情况下可以插入断点并收集数据。当结合 eBPF 使用时,能够实现高效灵活的事件触发逻辑处理和数据分析能力[^2]。 ### 安装依赖库 为了简化开发流程,建议安装 BCC 工具集(BPF Compiler Collection),它提供了 Python 和 Lua 接口来编写更易读写的脚本: ```bash sudo apt-get install bpfcc-tools linux-headers-$(uname -r) ``` ### 创建简单的 kprobe 跟踪器 下面是一个利用 eBPF 技术创建简单 kprobe例子,该实例会打印每次调用 `sys_clone` 函数的时间戳及其参数值: ```c #include <linux/bpf.h> #include <bpf/bpf_helpers.h> struct event_t { u64 ts; int pid; }; SEC("kprobe/sys_clone") int handle_sys_clone(struct pt_regs *ctx) { struct event_t event = {}; event.ts = bpf_ktime_get_ns(); event.pid = bpf_get_current_pid_tgid(); bpf_trace_printk("Clone called at %llu by PID:%d\n", event.ts, event.pid); return 0; } char LICENSE[] SEC("license") = "GPL"; ``` 编译上述 C 文件并将生成的对象加载至内核空间后即可生效。通过阅读 `/sys/kernel/debug/tracing/trace_pipe` 可查看输出日志信息。 ### 加载并运行 ebpf 程序 使用 iproute2 套件中的 bpftool 或者 libbpf API 来完成对象文件向内核的注入过程: ```bash bpftool prog load clone_tracker.o /sys/fs/bpf/ bpftool feature probe ``` 此时应该可以在系统的 trace pipe 中看到由我们的探测器产生的记录条目。 ### 卸载ebpf程序 结束追踪之后记得清理资源防止潜在冲突或内存泄漏问题发生: ```bash bpftool prog detach pinned /sys/fs/bpf/clone_tracker.kprobe.sys_clone kprobe/sys_clone rm -f /sys/fs/bpf/* ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值