本文面向使用过Solaris的mdb但是没有使用过Linux的crash的同学。比如说我自己,mdb用了很多年,现在全面转向Linux平台,于是很好奇Linux有没有类似的工具。熟悉Solaris的同学都知道,事后分析crashdump或者在线调试操作系统内核的强大工具就是mdb。而在Linux (以CentOS为例)中,类似的工具则是crash。当然,mdb不支持源码级的调试,只支持汇编级的调试。而crash则支持源码级的调试,因为跟gdb结合得非常紧密。

$ 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要好的地方在于支持源码级调试。

下面将介绍如何在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

在reboot之前,查看一下kdump是否active,果然不是

[root@idorax9 tmp]# systemctl is-active kdump
failed

4. reboot

5. reboot后,再次检查kdump是否active,必须是啦

[root@idorax9 tmp]# systemctl is-active kdump
active

6. 创建一个crashdump (类似solaris的reboot -d)

[root@idorax9 tmp]# echo 1 > /proc/sys/kernel/sysrq
[root@idorax9 tmp]# echo c > /proc/sysrq-trigger

7. 系统重启回来后,查看/var/tmp/vmcore

8. 尝试使用crash分析vmcore

8.1 安装NAMELIST,首先得启用CentOS-Debuginfo.repo

[root@idorax9 tmp]# cp /etc/yum.repos.d/CentOS-Debuginfo.repo /tmp
[root@idorax9 tmp]# vi /etc/yum.repos.d/CentOS-Debuginfo.repo
[root@idorax9 tmp]# diff /tmp/CentOS-Debuginfo.repo /etc/yum.repos.d/CentOS-Debuginfo.repo
20c20
< enabled=0
---
> enabled=1

8.2 安装NAMELIST, 注意/usr/lib/debug下面的内容为空,在安装之前

[root@idorax9 tmp]# yum clean all
[root@idorax9 tmp]# yum makecache [root@idorax9 tmp]# ls -lF /usr/lib/debug/
total 0
lrwxrwxrwx. 1 root root  7 May 31 20:33 bin -> usr/bin/
lrwxrwxrwx. 1 root root  7 May 31 20:33 lib -> usr/lib/
lrwxrwxrwx. 1 root root  9 May 31 20:33 lib64 -> usr/lib64/
lrwxrwxrwx. 1 root root  8 May 31 20:33 sbin -> usr/sbin/
drwxr-xr-x. 6 root root 65 May 31 20:33 usr/ [root@idorax9 tmp]# rpm -q kernel
kernel-3.10.0-514.el7.x86_64 # NOTE: The debuginfo should be kernel-debuginfo-3.10.0-514.el7.x86_64
[root@idorax9 tmp]# debuginfo-install kernel # NOTE: It took about 20m to download kernel-debuginfo-3.10.0-514.el7.x86_64.rpm

8.3 安装完成NAMELIST后

[root@idorax9 tmp]# ls /usr/lib/debug/lib/modules/
3.10.0-514.el7.x86_64

8.4 开始分析vmcore

[root@idorax9 tmp]# NAMELIST=/usr/lib/debug/lib/modules/3.10.0-514.el7.x86_64/vmlinux
[root@idorax9 tmp]# VMCORE=/var/crash/127.0.0.1-2017-05-31-22\:47\:32/vmcore
[root@idorax9 tmp]# crash $NAMELIST $VMCORE crash 7.1.5-2.el7
Copyright (C) 2002-2016 Red Hat, Inc.
...<snip>...............................................
This GDB was configured as "x86_64-unknown-linux-gnu"... KERNEL: /usr/lib/debug/lib/modules/3.10.0-514.el7.x86_64/vmlinux
DUMPFILE: /var/crash/127.0.0.1-2017-05-31-22:47:32/vmcore [PARTIAL DUMP]
CPUS: 1
DATE: Wed May 31 22:47:29 2017
UPTIME: 00:05:44
LOAD AVERAGE: 0.04, 0.41, 0.26
TASKS: 368
NODENAME: idorax9
RELEASE: 3.10.0-514.el7.x86_64
VERSION: #1 SMP Tue Nov 22 16:42:41 UTC 2016
MACHINE: x86_64 (2195 Mhz)
MEMORY: 1 GB
PANIC: "SysRq : Trigger a crash"
PID: 3408
COMMAND: "bash"
TASK: ffff88000a4b8fb0 [THREAD_INFO: ffff88003b564000]
CPU: 0
STATE: TASK_RUNNING (SYSRQ) crash>

终于进入crash> 的操作界面了!

NAMELIST就是/usr/lib/debug/lib/modules/3.10.0-514.el7.x86_64/vmlinux, 这也忒长了...Orz (不得不说,Linux在CLI易用性上比Solaris差远了)

o 看看Backtrace (用bt命令,mdb用$C)

o 再反汇编看看 (disas /m <mem addr>, 而mdb的语法是<mem addr>::dis)

结论: 显然,系统之所以panic,是因为向内存地址0x0处写入0x1。到此为止,我们从零开始,完整体验了一把使用crash工具定位Linux系统panic的root cause的全过程. 有关crash工具的使用及技术原理,请阅读后面列出的参考资料。(特别推荐参考资料6:Crash Dump Analysis

扩展:Solaris/Linux的工具链对比

# Solaris Linux(CentOS)
1 cc gcc
2 dbx gdb
3 mdb crash
4 dtrace systemtab, ftrace, LTTng
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

6. Crash Dump Analysiscrash | mdb

从mdb到crash的更多相关文章

  1. 【腾讯Bugly干货分享】聊聊苹果的Bug - iOS 10 nano_free Crash

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/hnwj24xqrtOhcjEt_TaQ9w 作者:张 ...

  2. iOS 10 开发适配系列 之 权限Crash问题

    升级 iOS 10 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天用一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然后看到控制台输出了以下信息 ...

  3. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  4. erlang 虚机crash

    现网服务,每次更新一个服务时,另外一个集群所有node 都跟着同时重启一遍,这么调皮,这是闹哪样啊.. 看系统日志:/var/log/messages Oct 30 15:19:41 localhos ...

  5. Breakpad Google的crash捕获、抓取开源库

    简介: Breadpad为google chrominum项目下用于处理dump的一套工具:内部采用跨平台方式实现捕获.生成.解析与平台无关的dump,便于统一处理:支持进程内与进程外捕获,当为进程外 ...

  6. SQL Server通过File Header Page来进行Crash Recovery

    SQL Server通过File Header Page来进行Crash Recovery 看了盖总的一篇文章 http://www.eygle.com/archives/2008/11/oracle ...

  7. ios crash的原因与抓取crash日志的方法

    首先我们经常会闪退的异常有哪些呢?crash的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug. 1.IOS策略 1.1 低内存闪退 前面提到大多数crash日志都包含着执行线程的栈调用 ...

  8. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  9. C#+arcengine10.0+SP5实现鹰眼(加载的是mdb数据库中的数据)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

随机推荐

  1. Mysql报Packet for query is too large (1040 > 1024)错误

    Linux下mysql 报Packet for query is too large (1040 > 1024)错误的解决方法 项目之前一直正常运行,这几天突然一直提示查询出错,看了下日志发现提 ...

  2. DateUtils常用方法

    一.DateUtils常用方法   1.1.常用的日期判断 isSameDay(final Date date1, final Date date2):判断两个时间是否是同一天: isSameInst ...

  3. 在Team Foundation Server (TFS)的代码库或配置库中查找文件或代码

    [update 2017.2.11] 最新版本的TFS 2017已经增加了代码搜索功能,可以参考这个链接 https://blogs.msdn.microsoft.com/visualstudioal ...

  4. 修改TFS附件大小的限制

    在TFS服务器使用浏览器上打开如下地址:http://localhost:8080/tfs/<CollectionName>/WorkItemTracking/v1.0/Configura ...

  5. java提示找不到或无法加载主类

    背景 默许jdk的配置大家都没有问题,执行java,javac无报错,但今天在尝试在本地起来kafka的时候,提示java 找不到或无法加载主类,然后日志中提示 Files 找不到或无法加载主类:C: ...

  6. how to trace the error log

    Executed as user: WTC\Ebw.Admin. Transaction (Process ID 95) was deadlocked on lock resources with a ...

  7. C博客作业05—指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1 学习体会 理解了指针在代码中的使用方法,学会使用指针进行参数操作 学会了结构体的定义方式与结构体的使用 经过持续一个周 ...

  8. java学习笔记—ServletConfig、ServletContext接口(13)

    ServletConfig是一个由Tomcat服务器在初始化Servlet的时候创建并传递进来的一个对象. 该对象主要描述的时候一个servlet的配置信息. 如: <servlet>  ...

  9. set 集合数据类型

    set 数据类型 set 与列表类似,区别在于 set 不能包含重复的值. In [1]: a_list = ['a', 'b', 'c', 'b', 'd', 'm', 'n', 'n'] In [ ...

  10. 洛谷P4586 [FJOI2015]最小覆盖双圆问题(最小圆覆盖)

    题面 传送门 前置芝士 最小圆覆盖 题解 我们按照\(x\)坐标排序,然后二分中间点,把点分成左右两边,对两边都做一个最小圆覆盖,那么半径大一点的那个就是答案了.然后对半径大的那一边继续二分就行了 然 ...