尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

vovix23实战项目性能优化:从卡顿到飞快的避坑指南

vovix23实战项目性能优化:从卡顿到飞快的避坑指南

vovix23实战项目性能优化:从卡顿到飞快的避坑指南 刚学会vovix23的语法,打开IDE想跑个 实战项目 ,结果页面转圈半天没反应?别急,这坑我踩过,你也别急着怀疑自己代码写错了。…

📅 2026/9/22 11:40:02
PHP-CS-Fixer 规则集解析:使用 @PHP5x4Migration 让代码兼容 PHP 5.4

PHP-CS-Fixer 规则集解析:使用 @PHP5x4Migration 让代码兼容 PHP 5.4

开发工具代码质量静态分析Lint格式化 【免费下载链接】PHP-CS-Fixer A tool to automatically fix PHP Coding Standards issues 项目地址: https://gitcode.com/gh_mirrors/ph/PHP-CS-Fixer 点击查看 免费下载 本指南围绕 PHP-CS-Fixer 中的 PHP5x4Migration 规则…

📅 2026/9/22 11:35:02
5分钟搞定zimu源码:速查手册助你告别调试噩梦

5分钟搞定zimu源码:速查手册助你告别调试噩梦

5分钟搞定zimu源码:速查手册助你告别调试噩梦 复制来的代码跑不通,报错信息满屏飞,新手最容易在这个阶段崩溃。别慌,今天这篇zimu实战源码解析,就是你的救命速查手册。我们不只讲怎么跑,更要讲清楚每一行代码背后的逻辑,让你从“只会复制”变…

📅 2026/9/22 11:35:02
MORE NEWS

更多资讯

📰

@@ERROR 和 @@ROWCOUNT 总用混?让 Codex 到 TaoToken 拿 Key 对照 SQL 全局变量表查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

携程网机票预订接口慢?3个完整示例教你提速50%

携程网机票预订接口慢?3个完整示例教你提速50% 学会语法却不知怎么搭项目,这是很多开发者卡在技术瓶颈期的真实写照。你盯着文档里的 async/await 或 CompletableFuture…

📰

一文搞懂 Python 处理大量数据的底层原理

一文搞懂 Python 处理大量数据的底层原理 配置环境就卡半天,跑个脚本内存直接爆表,是不是你的日常?别急,今天不聊虚的,咱们直接钻进 CPython 的官方源码仓库,扒一扒它是如何管理“大量”内存块的。很多新手觉得 Python…

📰

3步搞定ios游戏排行榜,面试必问的底层原理拆解

3步搞定ios游戏排行榜,面试必问的底层原理拆解 配置环境就卡半天,是不是常有的事?明明照着文档敲,本地跑不起来,一上线数据就乱。这不仅是环境问题,更是你对底层逻辑没吃透。很多面试官问起“如何设计高并发下的实时排行榜”,你只答得出Redis…

📰

3个坑避开全球幸福指数最佳实践

3个坑避开全球幸福指数最佳实践 配置环境就卡半天,是不是你也在这上面耗了一周?别急,这不是你的问题,是大多数开发者踩的“隐形坑”。我见过太多人在准备面试或落地项目时,因为环境配置、数据源选择、算法细节这三个环节卡住,导致整个“全球幸福指数”…

📰

xex积分实战避坑指南:从原理到完整示例

xex积分实战避坑指南:从原理到完整示例 面试时被问到“xex积分怎么算”,你卡壳了。面试官盯着你,你脑子里一片空白,只能硬扯“就是求和”,结果被追问精度问题直接凉透。别慌,这不是你的错,很多开发者对这类计算细节都一知半解。今天我就把xex…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬