Linux bpftool 的 prog list / map dump / prog load 调试命令链

2次阅读

bpftool 是 linux 内核标准 bpf 管理工具,核心命令组合为 prog list(查加载状态与 id)、map dump(查看 map 实时内容)、prog load(加载 elf 并可选 attach),典型调试链为 load → list → dump。

Linux bpftool 的 prog list / map dump / prog load 调试命令链

bpftool 是 Linux 内核提供的标准 BPF 调试与管理工具,用于查看、加载、卸载、dump 和 inspect BPF 程序与映射(map)。掌握 prog listmap dumpprog load 这组命令的典型组合,能快速完成 BPF 程序的部署验证与运行时状态分析。

prog list:确认程序是否已加载及获取关键元信息

执行 bpftool prog list 可列出当前内核中所有已加载的 BPF 程序。重点关注输出中的 idnametype(如 sched_cls、xdp、tracepoint)、tag(SHA-256 前 8 字节)和 loaded_at 时间戳。

若需过滤特定程序,可结合 grep 或使用 --json 输出后用 jq 解析。例如:

  • bpftool -j prog list | jq '.[] | select(.name == "my_tc_ingress")'
  • 记录下目标程序的 id(如 42),后续 map dump 或 attach 操作常需引用它

map dump:查看程序关联 map 的实时内容

BPF 程序常通过 map 与用户态交互或保存状态。bpftool map dump id <map_id></map_id>bpftool map dump name <map_name></map_name> 可导出 map 全量键值对。

注意以下细节:

  • map 必须是 非-percpu 类型(如 hash/Array)才支持完整 dump;percpu map 需指定 CPU ID,例如 bpftool map dump id 123 percpu-id 0
  • 若 map key/value 是结构体,需用 --raw + 自定义解析脚本,或提前用 bpftool map dump --json 获取十六进制原始数据
  • 常见调试场景:检查 tc clsact 中的计数 map 是否随包递增,或 XDP 程序的 drop 统计是否更新

prog load:加载 ELF 文件并可选自动 attach

bpftool prog load <bpf.o><target_path> [type <type>] [dev <ifname>] [map name <name> id <id>]</id></name></ifname></type></target_path></bpf.o> 是核心加载命令。

  • <bpf.o></bpf.o> 是 clang 编译生成的 BPF ELF(含 .text、.maps、.rodata 等 section)
  • <target_path></target_path> 是加载后在 /sys/fs/bpf/ 下的路径,如 /sys/fs/bpf/my_xdp_prog
  • 若需自动 attach(如 XDP 到网卡),必须显式加 type xdp dev eth0;tc 场景则常用 type sched_cls dev eth0 ingress
  • 若程序引用了 extern map(如 SEC(".maps") Struct { ... } my_map;),可用 map name my_map id 5 将已存在的 map 关联进去,避免重复创建

调试链建议顺序:load → list → dump

典型闭环流程如下:

  • 先用 bpftool prog load bpf.o /sys/fs/bpf/myprog type xdp dev eth0 加载
  • 立即执行 bpftool prog list | grep myprog 确认 id 和状态(running / Error
  • 查该 prog 引用的 map 名称(从源码或 bpftool prog dump jited id <id></id> 中的 relo section 推断),再用 bpftool map list | grep -A5 mymap 找到 map id
  • 最后 bpftool map dump id <map_id></map_id> 查看数据是否符合预期
text=ZqhQzanResources