我有一个嵌入式设备,使用 buildroot 构建,内核版本 3.6.11 运行 busybox。内核是使用完全默认的选项构建的。我已经根据网络人员指定的 IP、网关、网络掩码等配置了设备,并将这些值放入 /etc/network/interfaces 文件中。当系统启动时,一个电话ifconfig
告诉我所有的网络设置都是它们应该的。但是,我无法 ping 通与该设备位于同一子网上的任何其他计算机。我可以通过直接以太网电缆连接与我的主机进行通信,因此我认为网络适配器没问题 - 我可以ssh
连接到主机,并且主机可以从vsftpd
我安装在设备上的设备中正确查看目标。基本上我非常不确定如何继续诊断问题。我沉浸在互联网论坛 Linux 网络设置指南中却一无所获。另外,令人担忧的是,当我打字时
# ip addr show dev eth0
我收到 libuClibc-0.9.33.2.so 中出现段错误的报告。我使用 buildroot 构建了这一切,它报告一切都很成功。有没有可能我的内核损坏了?我真的不知道如何继续,因此我们将不胜感激地收到任何建议。
编辑的输出ip addr show dev eth0
是
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen
1000 link/ether 00:18:7d:19:a0:d8 brd ff:ff:ff:ff:ff:ff
inet 172.18.255.212/24 brd 172.18.255.255 scope global eth0
[ 331.700545] ip[951]: segfault at 0 ip b76e1f26 sp bfbd29b0 error 4 in
libuClibc-0.9.33.2.so[b76b5000+4d000]
Segmentation fault
当我在另一个适配器 eth1 上调用相同的命令时,我没有得到任何段错误,所以真的不知道发生了什么。
编辑2使用调试信息重建后,strace
我能够获得段错误的 strace 输出 - 我真的不知道这意味着什么,但除了看起来它试图写入一个可能不应该写入的位置(我没有将其全部包含在内) ,只是最后几行)。
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
ioctl(4, SIOCGIFTXQLEN, {ifr_name="eth1", ifr_qlen=1000}) = 0
close(4) = 0
write(1, "3: eth1: <BROADCAST,MULTICAST,UP"..., 793: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
) = 79
write(1, " link/ether 00:18:7d:19:a0:d7"..., 55 link/ether 00:18:7d:19:a0:d7 brd ff:ff:ff:ff:ff:ff
) = 55
open("/etc/iproute2/rt_scopes", O_RDONLY) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0xbfc91b30) = -1 ENOTTY (Inappropriate ioctl for device)
read(4, "#\n# reserved values\n#\n0\tglobal\n2"..., 4096) = 92
read(4, "", 4096) = 0
close(4) = 0
write(1, " inet 192.168.12.198/16 brd 1"..., 65 inet 192.168.12.198/16 brd 192.168.255.255 scope global eth1
) = 65
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV +++
Segmentation fault
答案1
我设法解决了分段错误问题,我将在此处记录该问题,以防将来有人遇到类似问题。我注意到当我拨打以下电话时
ip -f inet addr show dev eth0
代替
ip inet addr show dev eth0
那么段错误就不会发生,但它仍然会发生
ip -f inet6 addr show dev eth0
这让我得出结论,我的工具链或 busybox 中的某个地方一定与 IPv6 支持不兼容。我使用 buildroot 配置文件再次从头开始重建我的整个目标、工具链、内核和 uClibc,这一次确保我的交叉工具是在 IPV6 支持下创建的。设置该选项后,报告的段错误将不再发生。