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

我的问题是:



因此,要找出返回EINVAL的内容,我正在使用SystemTap。下面的脚本通过tpacket_snd函数的语句跟踪执行语句。

我的探测程序:info.stp

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

这是我对这种传输的实现的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")

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

我的问题是:
该输出与源代码无关(不匹配),因为:
  • 首先,
    指出在2707之后执行了af_packet.c行:27102710不包含跳转指令。


  • 其次,
    从我的调查中,我可以得出结论:[行2741-2745]

    如果(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指出了这一点。

  • 我的问题是:

    如何修理它或我错误地做了什么?

    最佳答案

    问题1:彼得说得很对。经过编译器优化后,由于不同C语句的指令混合在一起,因此源代码行似乎是按非线性顺序执行的。这不代表问题。

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

    关于linux - SystemTap似乎给出了不相关的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50825868/

    10-10 22:50