我姐姐有一台笔记本电脑,在 Windows 环境下总是崩溃(蓝屏)(硬件相对较新且最新)。当时她将 Windows 的转储文件发送给戴尔,戴尔派了一名工程师更换了主板,但在使用许多不同内核设置了多个不同版本的 Ubuntu 后,崩溃问题仍未消失。
因此,我决定采取行动,以找到问题的确切原因,我安装并配置了 linux-crashdump 包 (kdump-tools),以使用 kexec 自动启动崩溃内核,该内核会生成内存转储文件并存储 dmesg 输出。我还安装了 crash、kernel-image-generic-dbgsym 和 mcelog,以便收集尽可能多的信息。
因此笔记本电脑崩溃了,崩溃内核成功生成了一个转储文件并存储了 dmesg 输出。我还检查了 /var/log/mcelog,但该文件完全是空的,尽管守护进程在崩溃前正在运行,这很奇怪,但毕竟我们仍然有 dmesg 输出,其中显示:
[ 3933.364173] mce: [Hardware Error]: CPU 4: Machine Check Exception: 5 Bank 3: be00000000200135
[ 3933.364177] mce: [Hardware Error]: RIP !INEXACT! 10:<ffffffff8171d9c2> {_raw_spin_lock+0x12/0x50}
[ 3933.364182] mce: [Hardware Error]: TSC a0255fbd7f7 ADDR 42dd14480 MISC d62285
[ 3933.364185] mce: [Hardware Error]: PROCESSOR 0:306a9 TIME 1398357146 SOCKET 0 APIC 1 microcode 15
[ 3933.364186] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
[ 3933.364188] mce: [Hardware Error]: CPU 0: Machine Check Exception: 5 Bank 3: be00000000200135
[ 3933.364190] mce: [Hardware Error]: RIP !INEXACT! 33:<0000045a7992c1b5>
[ 3933.364191] mce: [Hardware Error]: TSC a0255fbd7f0 ADDR 42dd14480 MISC d62285
[ 3933.364194] mce: [Hardware Error]: PROCESSOR 0:306a9 TIME 1398357146 SOCKET 0 APIC 0 microcode 15
[ 3933.364195] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
[ 3933.364196] mce: [Hardware Error]: Machine check: Processor context corrupt
[ 3933.364197] Kernel panic - not syncing: Fatal Machine check
所以我的第一个问题是,关于“通过‘mcelog --ascii’运行上述操作”...我到底应该在那里运行什么以及如何运行?我尝试过例如:
[ 3933.364173] mce: [Hardware Error]: CPU 4: Machine Check Exception: 5 Bank 3: be00000000200135 | sudo mcelog --ascii
它什么也没返回。那么我在这里应该做什么呢?
我也跑了
crash /usr/lib/debug/boot/vmlinux<kernelversion> /path/to/crashdump/file
正如预期的那样,它启动了程序,然后我输入了bt
生成回溯的信息,得到了:
PID: 0 TASK: ffff8804177617f0 CPU: 6 COMMAND: "swapper/6"
#0 [ffff88042dd89ca0] machine_kexec at ffffffff8104a732
#1 [ffff88042dd89cf0] crash_kexec at ffffffff810e6ab3
#2 [ffff88042dd89db8] panic at ffffffff8170ec6c
#3 [ffff88042dd89e30] mce_panic at ffffffff8103687a
#4 [ffff88042dd89e70] do_machine_check at ffffffff81038684
#5 [ffff88042dd89f50] machine_check at ffffffff8171e25f
[exception RIP: intel_idle+216]
RIP: ffffffff813dfd78 RSP: ffff88041775de28 RFLAGS: 00000046
RAX: 0000000000000001 RBX: 0000000000000002 RCX: 0000000000000001
RDX: 0000000000000000 RSI: ffffffff81c93220 RDI: 0000000000000006
RBP: ffff88041775de50 R8: ffff88042dd912d0 R9: 000000000000001c
R10: 0000000000000320 R11: 0000000000000249 R12: 0000000000000002
R13: 0000000000000001 R14: 0000000000000001 R15: ffffffff81c932e8
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
--- <MCE exception stack> ---
#6 [ffff88041775de28] intel_idle at ffffffff813dfd78
#7 [ffff88041775de58] cpuidle_enter_state at ffffffff815c9570
#8 [ffff88041775de90] cpuidle_idle_call at ffffffff815c96a9
#9 [ffff88041775ded0] arch_cpu_idle at ffffffff8101ceae
#10 [ffff88041775dee0] cpu_startup_entry at ffffffff810beb85
#11 [ffff88041775df30] start_secondary at ffffffff81040fc8
总而言之,我想知道如何调用mcelog
dmesg 输出,以及可能采取哪些其他步骤来获取尽可能多的有关问题的信息/找到故障组件,以便我可以联系硬件供应商,并对问题所在有一个合理的猜测。
我知道 memcheck 如何帮助我高度预测 RAM 不是原因所在。
编辑:我已经找到了如何正确地将输出传递给 mcelog 的方法:将“通过‘mcelog --ascii’运行上述操作”之前的输出行放在一个文件中,然后mcelog
使用
sudo mcelog --ascii < file
可以看到,“通过‘mcelog --ascii’运行上述操作”消息在 dmesg 文件中打印了两次,因此我调用了 mcelog 两次,以“CPU:”开头,以消息前的行结束(我保留了 dmesg 中的内容,例如“[ 3933.364173] mce:[硬件错误]:”)。
所以mcelog
告诉我:
Hardware event. This is not a software error.
CPU 4 BANK 3 TSC a0255fbd7f7
RIP !INEXACT! 10:ffffffff8171d9c2
MISC d62285 ADDR 42dd14480
TIME 1398357146 Thu Apr 24 18:32:26 2014
MCG status:RIPV MCIP
MCi status:
Uncorrected error
Error enabled
MCi_MISC register valid
MCi_ADDR register valid
Processor context corrupt
MCA: Data CACHE Level-1 Data-Read Error
STATUS be00000000200135 MCGSTATUS 5
CPUID Vendor Intel Family 6 Model 58
RIP: _raw_spin_lock+0x12/0x50}
SOCKET 0 APIC 1 microcode 15
和
Hardware event. This is not a software error.
CPU 0 BANK 3 TSC a0255fbd7f0
RIP !INEXACT! 33:45a7992c1b5
MISC d62285 ADDR 42dd14480
TIME 1398357146 Thu Apr 24 18:32:26 2014
MCG status:RIPV MCIP
MCi status:
Uncorrected error
Error enabled
MCi_MISC register valid
MCi_ADDR register valid
Processor context corrupt
MCA: Data CACHE Level-1 Data-Read Error
STATUS be00000000200135 MCGSTATUS 5
CPUID Vendor Intel Family 6 Model 58
SOCKET 0 APIC 0 microcode 15
所以假设主板没问题(因为已经更换了),并且 RAM 也没问题,那么就只有 CPU 会出问题了,对吗?有谁知道给出的所有输出吗?
答案1
很好地选择了你所使用的仪器,这正是解决此类问题的方法。
crash dump 需要 Linux 调试符号,每个内核大约 600MB,这就是为什么默认情况下不安装它们的原因。下面介绍如何安装和使用这些符号调用 crash。
https://wiki.ubuntu.com/Kernel/CrashdumpRecipe
现在对我而言对您的机器检查进行深入分析有点晚了,但我的第一印象是 CPU 或主内存上的缓存受到了损害。
我要求提供全面保修更换。
如果这不可能,就换掉内存,这是一种廉价的测试,如果问题仍然存在,您可以相当肯定 CPU 是问题根源。此时,我会认真考虑更换 CPU 和购买新电脑之间的权衡。