首页 > 代码库 > 从mdb到crash

从mdb到crash

在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是否已经安装

[root@idorax9 tmp]# rpm -q kexec-tools
kexec-tools-2.0.7-50.el7.x86_64

我用的是CentOS 7, 默认已安装。

2. 安装system-config-kdump

[root@idorax9 tmp]# rpm -q system-config-kdump
package system-config-kdump is not installed
[root@idorax9 tmp]# 
[root@idorax9 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

[root@idorax9 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

从mdb到crash