首页/系统/Linux 内核与性能调优速查/bpftrace 探针参数与返回值

bpftrace 探针参数与返回值

kprobe 可用 argN 读取参数, kretprobe 用 retval 读取返回值; 用于没有追踪点的内核函数。

探针参数与返回值

内核函数探针可以在入口按签名顺序读取参数,返回探针可以在函数返回处读取返回值,用来观测那些没有追踪点覆盖的内核函数。参数顺序与函数签名一致,但在内核版本升级后签名可能变化,使用前应核对源码或符号信息,不要凭记忆写参数位置。

基本信息

适用平台Linux,需要内核 eBPF 支持与相应权限
入口探针按位置读取函数入参
返回探针读取函数返回值
前提条件函数需存在于符号表,且未被内联优化掉
风险点参数寄存器与数量随架构和版本变化

典型使用场景

  • 统计某个内部函数的调用频率,确认代码路径是否被走到。
  • 按写入长度、返回码等参数取值做分布统计。
  • 按返回值分类,区分成功路径与失败路径的开销。
  • 在打补丁或改配置后对比参数分布是否变化。
  • 配合耗时统计,在参数维度上区分快慢调用。

参数与返回值

参数与返回值
bpftrace -e 'kretprobe:vfs_write { @ = hist(retval); }'          # 返回值分布
bpftrace -e 'kprobe:vfs_write { @bytes = hist(arg2); }'           # 按位置的参数分布
bpftrace -e 'kretprobe:vfs_read /retval < 0/ { @[comm] = count(); }'   # 只统计失败返回
bpftrace -e 'kprobe:vfs_open { @[str(args->path->name)] = count(); }' # 指针参数需转换后统计
bpftrace -l 'kprobe:vfs_*'                                        # 核对函数名是否存在

探针类型与可读内容

类型可读内容注意点
入口探针按位置的入参顺序与函数签名一致,版本变化需核对
返回探针返回值失败路径同样会触发,需按需过滤
参数指针需转换后才能统计直接当数值统计没有意义
文档或源码里的参数注释是核对顺序的唯一可靠来源:不同发行版内核版本差异明显,照搬他人表达式是这类观测最常见的失败原因。
返回值统计要区分成功与失败路径:把错误返回和正常返回混在一个直方图里,得到的分布两种含义掺杂,无法解读。

易错点

  • 参数位置随架构与版本变化,跨环境复用脚本导致统计到完全无关的值。
  • 把指针参数直接当数值统计,输出毫无意义却不易察觉。
  • 函数已被内联,探针挂不上或挂到意外的位置,概率性丢数据。
  • 返回探针不做成功失败区分,分布图混杂两种语义。
  • 忘记核对函数名,探针启动失败后误判为权限问题。

数据来源与参考

  • bpftrace 官方文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌