gpt4 book ai didi

linux - SystemTap 似乎给出了不相关的输出

转载 作者:IT王子 更新时间:2023-10-29 00:22:32 27 4
gpt4 key购买 nike

我的系统是 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,0,0,0,0) syscall I've got EINVAL (Invalid Argument) and I am trying to investigate what the cause is.


因此,为了找出返回 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;

    被评估为 true - 请注意 SystemTap 指出第 2743 行已执行。但是,从另一方面来说,我用 SystemTap 调查过 po->has_vnet_hdr 等于 0,所以如果 body.txt 是不可能执行的。但是,SystemTap 指向它。

我的问题是:

如何修复或我哪里出错了?

最佳答案

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

问题 2:为了找出导致 -EINVAL 返回的语句,我会结合语句探测(就像你一样,除了打印 $$vars 以查看局部变量)AND 一个函数 .call/.return 探测对,当函数被离开时要注意。返回之前的最后几行语句跟踪行将是我寻找原因的地方。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com