首页/新闻资讯/正文详情

bpftrace探测点完全手册:kprobe、uprobe、tracepoint与fentry使用详解

发布时间:2026/9/22 11:39:54 来源:云帆数科 栏目:资讯中心
bpftrace探测点完全手册:kprobe、uprobe、tracepoint与fentry使用详解
bpftrace探测点完全手册kprobe、uprobe、tracepoint与fentry使用详解【免费下载链接】bpftraceHigh-level tracing language for Linux项目地址: https://gitcode.com/gh_mirrors/bp/bpftracebpftrace 是 Linux 上的高级追踪语言而**探测点Probe**是 bpftrace 脚本的核心——它决定了追踪发生在哪里。这篇文章带你完整掌握 bpftrace 最常用的四类探测点kprobe内核函数、uprobe用户态函数、tracepoint静态追踪点和fentry基于 BTF 的近零开销函数追踪覆盖如何列出可用探测点、四类探测点怎么选等高频问题新手和普通用户也能直接上手。上图展示了 bpftrace 各类探测点与 Linux 内核分层的对应关系kprobe 一族向内核对内核代码做动态插桩uprobe 一族面向用户态应用tracepoint 是编译进内核的静态追踪点而 fentry 则依附于 BTF 类型信息。 快速上手如何列出系统支持的探测点写脚本之前最实用的一招是先用bpftrace -l列出探测点看看当前系统到底支持什么bpftrace -l kprobe:*file* # 列出所有带 file 字样的 kprobe bpftrace -l t:syscalls:*openat* # 用短名 t 列出 openat 相关 tracepoint bpftrace -lv fentry:tcp_reset # -v 附加参数类型信息加上-v参数后bpftrace 会进一步显示每个探测点的参数名和参数类型如fentry:tcp_reset的sk、skb两个结构体指针帮你省掉查源码的时间。探测点还支持通配符甚至可以多探测点共享一个动作kprobe:tcp_reset,kprobe:*socket* { printf(Entered: %s\n, probe); }详细的列出探测点方法可参考 man/adoc/bpftrace.adoc。 四类核心探测点详解1️⃣ kprobe / kretprobe内核函数动态追踪kprobe 是 bpftrace 最经典的探测点实现对任意内核函数的动态插桩——每当该函数被调用BPF 程序就会运行一次kprobe:tcp_reset { tcp_resets count(); }变体kprobe[:模块]:函数例如kprobe:kvm:x86_emulate_insn可追踪 KVM 内核模块中的函数短名kkprobe、krkretprobe参数访问通过argN按寄存器顺序取参x86_64 上前 6 个非浮点参数走寄存器需要自己写类型转换来解引用结构体kretprobe在函数返回时触发只能拿到返回值retval拿不到入参。常见套路是入口存进 map、出口取出来还支持按文件:行号定位需 DWARF 调试信息方便在函数体内部打断点式追踪。完整细节见 docs/language.md。2️⃣ uprobe / uretprobe用户态函数与库追踪uprobe 是 kprobe 在用户态的镜像版本可以追踪任意进程里的函数调用uprobe:/bin/bash:readline { printf(arg0: %d\n, arg0); }短名uuprobe、ururetprobe追踪库时写库名即可uprobe:libc:malloc会自动通过/etc/ld.so.cache解析出完整路径同一库存在多个版本时如libssl.so.3建议显式写带版本号的 SONAME 避免挂错C 程序有惊喜加cpp限定符后可直接用人类可读的函数名含MyApp::Server::*通配符不必去记编译器混淆后的名字uretprobe拿retval但不能拿入参与 kretprobe 同样的限制⚠️ 追踪 C 时arg0可能是this指针追踪 Golang 等自带运行时的语言时uretprobe 的返回地址改写机制可能引发 runtime 报错需要留意。完整细节见 docs/language.md。3️⃣ tracepoint最稳定的静态追踪点tracepoint 是内核源码中预先定义、编译进内核的静态追踪点。与 kprobe 不同tracepoint 不依赖某个内核函数恰好存在接口更加稳定升级内核后脚本通常不用改tracepoint:syscalls:sys_enter_openat { printf(%s %s\n, comm, str(args.filename)); }短名t参数通过结构化的args对象按名字访问args.filename无需手动类型转换官方工具大量基于它实现例如仓库自带的 tools/opensnoop.bt 就同时挂在了sys_enter_open/openat/openat2三个 tracepoint 上逐条打印谁打开了哪个文件追求极致性能时还有rawtracepoint短名rt同样的挂点、更低的开销。完整细节见 docs/language.md。4️⃣ fentry / fexitBTF 加持的近零开销内核追踪fentry/fexit 是内核函数追踪的新一代方案早期叫 kfunc/kretfunc旧名仍可用与 kprobe 目标相同但优势明显基于eBPF trampoline机制调用开销接近于零利用BTF 类型信息在编译期自动推导参数类型不需要手动类型转换且对内核签名的小改动更稳健参数通过args对象按名字访问args.fd、args.skbfexit 可以拿到入参这是它相比 kretprobe 的一大优势短名ffentry、frfexit要求内核提供 BTF可用bpftrace --info确认还有fentry:bpf:...变体可以直接挂在正在运行的其他 BPF 程序上用于调试 BPF 程序本身。fexit:fget { printf(fd %d name %s\n, args.fd, str(retval.f_path.dentry.d_name.name)); }完整细节见 docs/language.md。⚖️ 选型指南kprobe、uprobe、tracepoint、fentry 怎么选探测点追踪目标参数访问稳定性 / 开销适用场景kprobe任意内核函数argN 手动转换动态插桩开销中等没有 BTF、或需要按偏移量挂函数中间fentry任意内核函数args自动类型需 BTF开销近零新内核上追踪内核函数的首选tracepoint内核标准事件args自动类型最稳定开销低系统调用、网络、调度器等标准化事件uprobe用户态函数 / 库argNDWARF 时为args动态插桩应用层调试malloc、readline 等一句话决策追标准事件选 tracepoint追内核函数选 fentry有 BTF 时否则 kprobe追用户程序选 uprobe应用自带 USDT 探针时则用usdt短名U。 实战追踪谁打开了文件把前面的知识串起来——追踪 open 系统调用时入口和出口要配对入口先记下文件名出口再按线程把文件名和返回码文件描述符或负 errno关联起来。官方工具 tools/opensnoop.bt 就是这个模式的完整实现运行后可以看到PID COMM FD ERR PATH 37421 bpftrace 33 0 /sys/kernel/debug/tracing/events/syscalls/...类似的现成工具execsnoop、tcplife、runqlat 等都在 tools/ 目录下是学习各种探测点用法的最佳范本所有探测点的速查表含 profile、hardware、interval 等 15 种见 docs/language.md。 小结用bpftrace -l/bpftrace -lv先列出探测点再动手写脚本可以少走 90% 的弯路kprobe / uprobe 灵活但参数靠argN硬取适合哪里都能插的动态场景tracepoint / fentry 基于静态定义与 BTF 类型参数按名访问脚本更稳、更易读是官方推荐方向记住短名k、kr、u、ur、t、f、fr能让脚本更短更好维护。掌握这四种探测点你就拿到了 bpftrace 内核追踪与用户态调试的钥匙下一步不妨直接读一读 tools/opensnoop.bt 的源码感受真实工具中 tracepoint 的写法。【免费下载链接】bpftraceHigh-level tracing language for Linux项目地址: https://gitcode.com/gh_mirrors/bp/bpftrace创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

淘宝钻石等级避坑指南:5个性能优化实战
淘宝钻石等级避坑指南:5个性能优化实战

淘宝钻石等级避坑指南:5个性能优化实战 复制来的代码跑不通,报错信息看得人头大?别急,这是很多开发者在接触【淘宝钻石等级】相关系统时的共同痛点。今天这份避坑指南,不讲虚的,直接上性能优化实战。我们针对一个典型的等级计算与展示模块,从性能瓶颈… · 2026/9/22 11:39:41

ppt怎么做背景最佳实践:3个实战案例搞定面试高频考点
ppt怎么做背景最佳实践:3个实战案例搞定面试高频考点

ppt怎么做背景最佳实践:3个实战案例搞定面试高频考点 面试被问“ppt怎么做背景”却答不上来原理?别慌,这题看似简单,实则考察你对 最佳实践 的理解。 3秒直击痛点… · 2026/9/22 11:39:29

110105图解原理:告别官方文档,3招搞定性能瓶颈
110105图解原理:告别官方文档,3招搞定性能瓶颈

110105图解原理:告别官方文档,3招搞定性能瓶颈 官方文档太厚,翻半天找不到重点,这是很多工程师的通病。面对复杂的系统瓶颈,我们往往陷入代码细节的泥潭,而忽略了宏观的【图解原理】。今天直接切入核心,用数据说话,解决【110105】场景下… · 2026/9/22 11:39:11

DNF背景故事代码化解析:3个技巧搞定性能优化面试
DNF背景故事代码化解析:3个技巧搞定性能优化面试

DNF背景故事代码化解析:3个技巧搞定性能优化面试 面试官问:“你懂DNF背景故事里的性能优化吗?”我当场愣住。别笑,这不是段子。去年我面一家大厂,技术二面官拿着DNF的剧情截图问:“这段回忆杀动画加载卡了3秒,你怎么优化?”我脑子里全是阿… · 2026/9/22 12:10:29

emqtt实战:搞定证书配置与集群高可用的最佳实践
emqtt实战:搞定证书配置与集群高可用的最佳实践

emqtt实战:搞定证书配置与集群高可用的最佳实践 刚拿到emqtt文档,是不是在配置TLS证书时卡了半小时?看着那一堆 openssl… · 2026/9/22 12:10:22

桂林站源码深度剖析:保姆级教程带你搞定报错
桂林站源码深度剖析:保姆级教程带你搞定报错

桂林站源码深度剖析:保姆级教程带你搞定报错 刚打开桂林站的源码工程,控制台直接飘红一片。Stack Trace 长得像天书,满屏的 NullPointerException 和… · 2026/9/22 12:10:16

3个案例讲透方式和方法的区别与性能优化
3个案例讲透方式和方法的区别与性能优化

3个案例讲透方式和方法的区别与性能优化 刚把项目从 v2.0 升到 v3.0,发现原本跑得飞快的接口突然变慢,API 文档里那些熟悉的调用方式全变了,连错误码都换了套体系。这种“版本升级后 API… · 2026/9/22 12:10:10

北通游戏手柄使用教程实战:面试必问的API避坑与从零搭建指南
北通游戏手柄使用教程实战:面试必问的API避坑与从零搭建指南

北通游戏手柄使用教程实战:面试必问的API避坑与从零搭建指南 版本升级后 API 全变了,这大概是所有硬件外设开发者最头疼的事。很多新手拿着北通游戏手柄,发现网上那些过时的代码跑不起来,报错信息满天飞,甚至直接连接失败。别慌,这不仅是你的问… · 2026/9/22 12:10:04

3个坑搞定开环控制:手写实现PID避坑指南
3个坑搞定开环控制:手写实现PID避坑指南

3个坑搞定开环控制:手写实现PID避坑指南 刚接手项目,从GitHub复制了一段经典的PID控制代码,信心满满地跑起来。结果呢?电机嗡嗡响,输出值在0和最大值之间疯狂抖动,要么直接饱和,要么响应慢得像蜗牛。你盯着屏幕,看着那个不断跳变的日志… · 2026/9/22 12:09:09

5个电影海报图片处理坑,新手避坑指南
5个电影海报图片处理坑,新手避坑指南

5个电影海报图片处理坑,新手避坑指南 刚写完代码,一运行屏幕直接炸了。满屏红色的 StackTrace 滚得比弹幕还快,什么 NullPointerException 、 ImageIO.read() returned null 、… · 2026/9/22 0:00:07

注册微信公众账号:一文搞懂从0到1全流程
注册微信公众账号:一文搞懂从0到1全流程

注册微信公众账号:一文搞懂从0到1全流程 复制来的代码跑不通,报错信息满屏飞,到底卡在哪?别急,咱们先停下手里的调试。很多开发者觉得注册微信公众账号只是填个表单、传个身份证那么简单,真上手才发现坑深不见底。今天这篇 一文搞懂… · 2026/9/22 0:00:07

手写实现图片压缩网站核心:搞定WebP转换与质量调优
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站… · 2026/9/22 0:00:19

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码