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

bpftool 是 Linux 内核提供的标准 BPF 调试与管理工具,用于查看、加载、卸载、dump 和 inspect BPF 程序与映射(map)。掌握 prog list、map dump、prog load 这组命令的典型组合,能快速完成 BPF 程序的部署验证与运行时状态分析。
prog list:确认程序是否已加载及获取关键元信息
执行 bpftool prog list 可列出当前内核中所有已加载的 BPF 程序。重点关注输出中的 id、name、type(如 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>查看数据是否符合预期










