linux – SystemTap似乎给出了无关的输出

前端之家收集整理的这篇文章主要介绍了linux – SystemTap似乎给出了无关的输出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的系统是Ubuntu,uname -r = 4.15.0-23-generic.我已经为内核安装了调试符号.

我的问题是:

I am trying to use socket(AF_PACKET,SOCK_DGRAM,0) for transmision
purpose. For sendto(fd,0) syscall I’ve got EINVAL
(Invalid Argument) and I am trying to investigate what the cause is.

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

我的探测程序:info.stp

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

这是我执行这种传输的sudo stap info.stp的输出

  1. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
  2. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
  3. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
  4. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
  5. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
  6. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
  7. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
  8. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
  9. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
  10. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
  11. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
  12. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
  13. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
  14. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
  15. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
  16. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
  17. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
  18. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
  19. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
  20. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
  21. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2694")
  22. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2693")
  23. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2706")
  24. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2710")
  25. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2707")
  26. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2708")
  27. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2709")
  28. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2712")
  29. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2743")
  30. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2728")
  31. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2736")
  32. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2735")
  33. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2785")
  34. HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2787")
  35. 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]

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

>首先,
指出af_packet.c:2707行是在2710之后执行
2710不包含跳转指令.

>其次,
根据我的调查,我可以提出这样的条件:[第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指出了它.

我的问题是:

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

解决方法

Q1:彼得是对的.在编译器优化之后,源行可能看起来以非线性顺序执行,因为不同C语句的指令是混合的.这不代表问题.

Q2:为了找出导致-EINVAL返回的语句,我将结合使用语句探测器(除了打印$$变量以查看局部变量之外)和函数.call / .return探测对,以便注意何时功能正在被搁置.在返回之前的最后几条语句跟踪线将是我寻找原因的地方.

猜你在找的Linux相关文章