什么是crash
linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成转储文件 vmcore和dmesg。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。 crash 就是一个被广泛使用的内核崩溃转储文件分析工具,掌握 crash 的使用技巧,对于定位问题有着十分重要的作用。
crash使用
接上文,系统安装kdump成功后,使用如下命令手动触发系统panic
sudo echo c > /proc/sysrq-trigger
系统崩溃,重启后生成挂死日志
cuibixuan@cuibixuan-virtual-machine:/var/crash$ ls
202001301611 kdump_lock kexec_cmd linux-image-5.0.0-27-generic-202001301611.crash
在202001301611目录下有2个文件:
dmesg.202001301611:上次启动的内核dmesg信息
dump.202001301611:上次崩溃的信息
crash分析
dmesg文件分析
dmesg文件存储上次内核的dmesg信息,在系统崩溃的堆栈信息,记录在这里
[ 266.402416] Kernel panic - not syncing: sysrq triggered crash //这里描述内核因为sysrq trigger触发panic
[ 266.402418] CPU: 0 PID: 1857 Comm: bash Kdump: loaded Not tainted 5.0.0-27-generic #28~18.04.1-Ubuntu
[ 266.402419] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018
[ 266.402420] Call Trace: //这里堆栈信息
[ 266.402426] dump_stack+0x63/0x85
[ 266.402428] panic+0xfe/0x2a4
[ 266.402431] sysrq_handle_crash+0x15/0x20
[ 266.402432] __handle_sysrq+0x9f/0x170
[ 266.402433] write_sysrq_trigger+0x34/0x40
[ 266.402435] proc_reg_write+0x3e/0x60
[ 266.402437] __vfs_write+0x1b/0x40
[ 266.402438] vfs_write+0xb1/0x1a0
[ 266.402439] ksys_write+0x5c/0xe0
[ 266.402441] __x64_sys_write+0x1a/0x20
[ 266.402443] do_syscall_64+0x5a/0x120
[ 266.402444] entry_SYSCALL_64_after_hwframe+0x44/0xa9
以上信息对内核人员非常重要,在实际分析时,基本根据堆栈信息就可以推敲出错原因,当然这需要一些经验和内核知识,这里不再展开,有时间讲一讲。
dump文件分析
如果仔细查看,dump文件有40M大小,远远大于dmesg文件,里面存储着上次内核的非常丰富的内核信息,包括cpu、内存、进程等等,方便内核人员查看到根因。因为自己电脑虚拟只开了一会,如果实际业务执行,经常每个crash文件有几个G。
root@cuibixuan-virtual-machine:/var/crash/202001301611# ls -lhh
total 40M
-rw------- 1 root whoopsie 49K 1月 30 16:11 dmesg.202001301611
-rw------- 1 root whoopsie 40M 1月 30 16:11 dump.202001301611
分析dump文件需要内核vmlinux,安装对应内核的dbgsym包
cuibixuan@cuibixuan-virtual-machine:~$ uname -r
5.0.0-27-generic
cuibixuan@cuibixuan-virtual-machine:~$ sudo apt-cache search linux-image |grep dbgsym |grep 5.0.0-27-generic
linux-image-unsigned-5.0.0-27-generic-dbgsym - Linux kernel debug image for version 5.0.0 on 64 bit x86 SMP
linux-image-5.0.0-27-generic-dbgsym - Signed kernel image generic
cuibixuan@cuibixuan-virtual-machine:~$ sudo apt-get instal