Linux 系统死机:常见原因和定位方法
常见原因
- 驱动程序错误:错误或不兼容的内核驱动程序是常见的崩溃原因。
- 硬件故障:包括坏的内存条、故障的硬盘,或不稳定的电源供应。
- 内存耗尽:当系统内存或交换空间耗尽时可能导致系统崩溃。
- 文件系统错误:损坏的文件系统或磁盘错误也可能导致系统崩溃。
- 内核bug:Linux内核中的代码错误可能导致系统不稳定。
定位方法
1. 使用Debug口
接debug口,复现死机现象,查看系统控制台消息。
2. 内核崩溃转储 (Kernel Crash Dump)
(1). 开启核心转储
在系统开机脚本添加以下命令以启用核心转储:
ulimit -c unlimited
echo 1 > /proc/sys/kernel/core_uses_pid
echo "/root/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
(2). 使用GDB调试core文件
制造一个Segmentation fault
错误来生成core文件。例如,编写以下C程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int *p = NULL;
*p = 100; // 这将产生 Segmentation fault
return 0;
}
编译并运行程序:
gcc -o hello hello.c -g
./hello
这将在/root
目录生成一个core-xxx-xxx-xxx
文件。使用GDB调试core文件:
gdb hello core
3. 内存测试
使用memtest
命令检查物理内存是否存在问题。
4. 查看日志文件
检查/var/log
目录下的日志文件,特别是/var/log/kern.log
和/var/log/syslog
。这些日志可能包含崩溃前的最后几条消息。