eBPF Talk: btrace v0.2.0 发布
文章目录
btrace
是什么?btrace
是一款 bpf 时代的现代化内核函数动态追踪工具。
btrace
重命名自 bpflbr
,参考 eBPF Talk: 使用 Last Branch Record 动态追踪内核函数,在 bpflbr
v0.1.0 的基础上,新增了几个重要的功能:
- 使用简单的 C 表达式来过滤函数参数的属性。
- 根据函数参数来过滤需要动态追踪的内核函数列表。
- 使用 pcap-filter(7) 语法来过滤网络包。
- 支持
--output-pkt
输出网络包里的五元组信息。
使用简单的 C 表达式来过滤函数参数的属性
使用 eBPF Talk: 动态过滤函数参数 里介绍的 bice 库,btrace
可以使用简单的 C 表达式来过滤函数参数的属性。
基于 bice
库,该功能的实现原理:
- 匹配内核函数里的参数名称。
- 根据参数的索引,生成一段调用
bpf_get_func_arg()
helper 的 bpf 字节码。 - 使用
bice
库将 C 表达式编译成一段 bpf 字节码。 - 将这 2 段字节码拼接到一起,然后注入到
btrace
bpf prog 的filter_fnarg()
桩函数里。
根据函数参数来过滤需要动态追踪的内核函数列表
pwru 项目里动态追踪的是名称为 skb
且类型为 struct sk_buff *
的参数的内核函数列表。
socketrace 项目里动态追踪的是名称为 sk
且类型为 struct sock *
的参数的内核函数列表。
btrace
也支持根据函数参数来过滤需要动态追踪的内核函数列表:
|
|
使用 pcap-filter(7) 语法来过滤网络包
如果被动态追踪的函数带有 struct sk_buff *skb
、struct __sk_buff *skb
、struct xdp_buff *xdp
、struct xdp_md *xdp
等参数,btrace
可以使用 pcap-filter(7) 语法来过滤网络包。
|
|
类似过滤函数参数的实现方式,该功能的实现原理:
- 匹配内核函数里的参数。
- 使用 elibpcap 库将 pcap-filter(7) 表达式注入到
btrace
bpf prog 的桩函数里。 - 根据参数的索引,生成一段调用
bpf_get_func_arg()
helper 的 bpf 字节码。 - 如果是
skb
,则调用filter_skb()
桩函数,如果是xdp
,则调用filter_xdp()
桩函数。 - 将最终的 bpf 字节码注入到
filter_pkt()
桩函数里。
支持 --output-pkt
输出网络包里的五元组信息
既然支持过滤网络包,当然也可以支持输出网络包里的五元组信息:
|
|
类似于过滤网络包的实现方式,该功能的实现原理:
- 匹配内核函数里的参数。
- 根据参数的索引,生成一段调用
bpf_get_func_arg()
helper 的 bpf 字节码。 - 如果是
skb
,则调用output_skb()
桩函数,如果是xdp
,则调用output_xdp()
桩函数。 - 将最终的 bpf 字节码注入到
output_pkt()
桩函数里。
总结
btrace
是一款 bpf 时代的现代化内核函数动态追踪工具:
- 支持输出 LBR 记录。
- 支持反汇编内核函数和 bpf prog。
- 支持输出函数调用栈。
- 支持输出带类型信息的参数和带类型的返回值。
- 支持使用简单的 C 表达式来过滤函数参数的属性。
- 支持根据函数参数来过滤需要动态追踪的内核函数列表。
- 支持使用 pcap-filter(7) 语法来过滤网络包。
- 支持
--output-pkt
输出网络包里的五元组信息。
未来将支持更多功能,敬请期待!
btrace
项目地址:btrace。
文章作者 Leon Hwang
上次更新 2025-03-09
知识星球
星球里的专栏:
《XDP 进阶手册》
