我的系统是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行:2710
2710
不包含跳转指令。 从我的调查中,我可以得出结论:[行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/