如何在bpftrace中使用内核宏函数?ip_hdr调用报错求助
bpftrace中使用ip_hdr宏报错的原因及解决办法
错误原因
bpftrace无法直接识别并展开内核头文件中的ip_hdr这类宏函数,核心原因如下:
- 这类宏是针对内核编译环境设计的,依赖C预处理器展开,但bpftrace的eBPF虚拟机不支持完整解析这类依赖内核内部结构细节的宏逻辑。
- 即便脚本中包含了
<linux/ip.h>,bpftrace处理脚本时不会像常规C编译器那样展开所有内核宏,ip_hdr恰好是依赖sk_buff内部字段的宏,无法被自动识别。
解决办法
ip_hdr宏的本质是从sk_buff的network_header偏移位置获取IP头部指针,我们可以直接在bpftrace脚本中手动实现这个逻辑,修改后的脚本如下:
#include <linux/ip.h> #include <linux/skbuff.h> kprobe:icmp_echo { $skb = (struct sk_buff *)arg0; $iph = (struct iphdr *)($skb->head + $skb->network_header); printf("sip:%x\n", $iph->saddr); printf("dip:%x\n", $iph->daddr); }
补充说明:
- 主流Linux内核版本的
sk_buff结构都包含head和network_header字段,该写法具备通用性。 - 如果需要处理IPv6报文,可参照同样逻辑,手动计算
ipv6hdr的偏移位置。
内容的提问来源于stack exchange,提问作者Jams.Liu
相关产品推荐
相关产品推荐

