【问题标题】:SystemTap seems to give unrelevant outputSystemTap 似乎给出了不相关的输出
【发布时间】:2018-11-22 08:45:35
【问题描述】:

我的系统是 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("","@"))
}

这是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]


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

  1. 首先, 指出af_packet.c:2707这一行是在2710之后执行的 2710 不包含跳转指令。

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

我的问题是:

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

【问题讨论】:

  • 我最初的反应是,这只是经过优化的编译器输出。无法保证底层汇编程序的顺序与源代码匹配。
  • 对于SOCK_DGRAM 套接字,您必须在每个sendto() 处指定一个目标地址。为addr传NULL, 0,addr_len无效。

标签: linux kernel trace systemtap


【解决方案1】:

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

Q2:为了找出导致 -EINVAL 返回的语句,我会结合语句探针(就像你一样,除了打印 $$vars 来查看局部变量)AND 一个函数 @987654322 @/.return 探针对,注意何时离开该功能。返回之前的最后几行语句跟踪行将是我寻找原因的地方。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2019-08-04
    • 2014-04-08
    • 2022-08-13
    • 2022-01-17
    • 2019-06-14
    • 2012-09-04
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多