Gil*_*esz 8 linux trace kernel systemtap
我的系统是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("","@"))
}
Run Code Online (Sandbox Code Playgroud)
以下是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")
Run Code Online (Sandbox Code Playgroud)
[ https://elixir.bootlin.com/linux/v4.15/source/net/packet/af_packet.c#L2618]
我的问题是:输出与源代码无关(与之匹配),因为:
2707在2710
2710没有跳转指令 之后执行了行af_packet.c:.其次,根据我的调查,我可以提出这样的条件:[第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 返回,我将结合语句探针(就像您一样,除了打印$$vars以查看局部变量)和函数.call/.return探针对,以记录函数何时被保留。返回之前的最后几行语句跟踪行将是我寻找原因的地方。
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |