SystemTap似乎给出了无关的输出

Gil*_*esz 8 linux trace kernel systemtap

我的系统是Ubuntu , uname -r = 4.15.0-23-generic. 我已经为内核安装了调试符号.

我的问题是:


我正在尝试socket(AF_PACKET, SOCK_DGRAM, 0)用于传输目的.对于sendto(fd, 0,0,0,0,0)系统调用我有EINVAL (无效参数),我试图调查原因是什么.


因此,要找出EINVAL我使用SystemTap 返回的内容.下面的脚本按tpacket_snd功能语句跟踪执行语句.

我的探测程序:info.stp

probe kernel.statement("tpacket_snd@*:*") {
    tokenize(pp(),"@");
    printf("HIT %s\n", tokenize("","@"))
}
Run Code Online (Sandbox Code Playgroud)

以下是sudo stap info.stp我实现这种传输的输出:

HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2694")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2693")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2706")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2710")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2707")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2708")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2709")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2712")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2743")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2728")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2736")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2735")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2785")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2787")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2789")
Run Code Online (Sandbox Code Playgroud)

[ https://elixir.bootlin.com/linux/v4.15/source/net/packet/af_packet.c#L2618]


我的问题是:输出与源代码无关(与之匹配),因为:

  1. 首先,指出27072710 2710没有跳转指令 之后执行了行af_packet.c:.

  1. 其次,根据我的调查,我可以提出这样的条件:[第2741-2745行]

    if(po-> has_vnet_hdr && virtio_net_hdr_to_skb(skb,vnet_hdr,vio_le())){tp_len = -EINVAL; 转到tpacket_error; }

    评估了SystemTap指出第2743行已执行的真实情况.但是,从另一方面来看,我已经使用SystemTap进行了调查,该调查po->has_vnet_hdr等于0,因此如果是body,则无法执行.但是,SystemTap指出了它.

我的问题是:

如何修复它或我做错了什么?

fch*_*che 0

Q1:彼得说得很对。编译器优化后,源代码行可能会以非线性顺序执行,因为不同 C 语句的指令混合在一起。这并不代表有问题。

Q2:为了找出哪个语句导致 -EINVAL 返回,我将结合语句探针(就像您一样,除了打印$$vars以查看局部变量)函数.call/.return探针对,以记录函数何时被保留。返回之前的最后几行语句跟踪行将是我寻找原因的地方。