我刚刚升级了 Ubuntu 20.04。
升级后,我突然开始看到大量如下的段错误:
[ 87.157912] perl[5442]: segfault at 0 ip 0000556a510d9f05 sp 00007fff768ae410 error 6 in perl[556a510d5000+16a000]
[ 87.157919] Code: be 08 00 00 00 48 c1 f9 03 48 8d 6c 09 02 48 81 fd 00 08 00 00 48 0f 47 e8 48 89 ef e8 54 cc ff ff 48 8d 54 e8 f8 48 8d 48 20 <48> 89 10 49 8b 54 24 08 48 89 50 08 49 89 44 24 08 48 8b 10 48 c1
[ 87.158481] perl[5504]: segfault at 0 ip 000055db4eb74f05 sp 00007fff87b13870 error 6 in perl[55db4eb70000+16a000]
[ 87.158489] Code: be 08 00 00 00 48 c1 f9 03 48 8d 6c 09 02 48 81 fd 00 08 00 00 48 0f 47 e8 48 89 ef e8 54 cc ff ff 48 8d 54 e8 f8 48 8d 48 20 <48> 89 10 49 8b 54 24 08 48 89 50 08 49 89 44 24 08 48 8b 10 48 c1
[ 87.613155] perl[5509]: segfault at 8 ip 00005597f965f58a sp 00007ffdc4c26d60 error 4 in perl[5597f95f1000+16a000]
[ 87.613166] Code: 00 00 00 48 8b 06 0f b7 40 20 66 0f 1f 44 00 00 66 85 c0 0f 84 aa 0e 00 00 83 e8 01 0f b7 c0 8d 34 18 49 8b 46 18 48 8d 14 f0 <8b> 02 85 c0 0f 85 8c 00 00 00 44 89 22 49 8b 46 18 89 da 83 44 d0
问题不限于此perl
,所以我认为我的升级过程中出了问题。
我做了内存测试,发现内存模块坏了。这可以解释段错误。
我现在已经删除了坏的内存模块,并且系统通过了内存测试。
但问题仍然存在。
然后我想:也许 libc (或类似的)在升级过程中被内存模块损坏了。所以我跑了:
debsums | grep -v OK
并且它没有显示任何错误。
什么会导致段错误?
编辑:
我已强制重新安装 libc6 和 libc6++。但这并未解决问题。
好的部分是,我可以通过将系统置于重负载下来引发错误。当这种情况发生时,程序将开始抱怨内存不足(但还有 80 GB 可用交换空间)和“xmalloc 失败”。
一种解释是内核在某个malloc
例程中是否有翻转位。
在升级期间,使用 构建了新的 initrd (和内核?)update-initramfs
。如果我们假设其中的某些部分是通过有故障的 RAM 完成的,因此我的内核有一些位错误,那么我怎样才能干净地重建它呢?即,make clean
在运行之前我该如何操作update-initramfs
,以便所有输入都保持原始状态?
编辑2:
当我让机器承受重负载时,像 Xorg 和 Firefox 这样的程序就会崩溃。如果我的虚拟内存不足,但还有 80 GB 可用空间,这种行为就不足为奇了。
运行strace
通过单个strace
命令强制所有重负载,然后就不会发生段错误。
编辑3:
我无法再可靠地重现该错误。它并没有消失,但发生的频率要低得多。