在Solaris上,事后分析crashdump或者在线调试操作系统内核的强大工具就是mdb。当然,mdb不支持源码级的调试,只支持汇编级的调试。而在Linux (以CentOS为例),类似的工具是crash。
$ man -s8 crash NAME crash - Analyze Linux crash dump data or a live system SYNOPSIS crash [OPTION]... NAMELIST MEMORY-IMAGE[@ADDRESS] (dumpfile form) crash [OPTION]... [NAMELIST] (live system form)...<snip>...
mdb的使用比crash要简单一些,因为不需要自己安装NAMELIST。但crash比mdb要好的地方在于支持源码级调试,因为跟gdb配合非常紧密。
下面将介绍如何在CentOS上使用crash分析一个crashdump文件。
第一次使用crash的感觉很蒙圈,因为搞不懂神马是NAMELIST。
注意:使用mdb进行live的调试,就不需要神马NAMELIST。很简单, -K(大K)只能在console上使用,可以让整个内核挂起。例如:
root# mdb -k #<-- Live kernel or root# mdb -K #<-- kmdb
这种情况下只能问度娘和qwant(在家上不了Google)了,幸运的是找到了Red Hat Enterprise Linux 7 Kernel Crash Dump Guide。于是按照Guide的提示一步一步来。有关kdump的简介截图如下:
1. 检查kexec-tools是否已经安装
[[email protected] tmp]# rpm -q kexec-tools kexec-tools-2.0.7-50.el7.x86_64
我用的是CentOS 7, 默认已安装。
2. 安装system-config-kdump
[[email protected] tmp]# rpm -q system-config-kdump package system-config-kdump is not installed [[email protected] tmp]# [[email protected] tmp]# yum install system-config-kdump
3. 通过GUI对kdump进行配置 (goto Applications->System Tools->Kernel crash dumps)
选Basic Settings -> Manual settings, 将New kdump Memory设置为128M, 其他都使用默认设置,然后点Apply
点击apply后,会遇到"Unable to handle kdump services"的错误,不用理会,接下来需要reboot
查看一下kdump是否active
[[email protected] tmp]# systemctl is-active kdump failed
4. reboot
5. reboot后,再次检查kdump是否active
扩展:Solaris/Linux的工具链对比
# | Solaris | Linux(CentOS) |
1 | cc | gcc |
2 | dbx | gdb |
3 | mdb | crash |
4 | dtrace | systemtab, ftrace |
5 | truss | strace |
参考资料:
1. Red Hat Enterprise Linux 7 Kernel Crash Dump Guide
2.Analyzing Linux kernel crash dumps with crash - The one tutorial that has it all
3. http://elixir.free-electrons.com/linux/v4.12-rc3/source/Documentation/kdump/kdump.txt
4. https://github.com/crash-utility/crash