You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:42:43