探针参数与返回值
内核函数探针可以在入口按签名顺序读取参数,返回探针可以在函数返回处读取返回值,用来观测那些没有追踪点覆盖的内核函数。参数顺序与函数签名一致,但在内核版本升级后签名可能变化,使用前应核对源码或符号信息,不要凭记忆写参数位置。
基本信息
| 适用平台 | 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_*' # 核对函数名是否存在探针类型与可读内容
| 类型 | 可读内容 | 注意点 |
|---|---|---|
| 入口探针 | 按位置的入参 | 顺序与函数签名一致,版本变化需核对 |
| 返回探针 | 返回值 | 失败路径同样会触发,需按需过滤 |
| 参数指针 | 需转换后才能统计 | 直接当数值统计没有意义 |
文档或源码里的参数注释是核对顺序的唯一可靠来源:不同发行版内核版本差异明显,照搬他人表达式是这类观测最常见的失败原因。
返回值统计要区分成功与失败路径:把错误返回和正常返回混在一个直方图里,得到的分布两种含义掺杂,无法解读。