本文面向使用过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. C#基础入门 七

    C#基础入门 七 接口 由于C#语言不支持多重继承,所以可以使用接口模拟结构的继承,通过使用interface关键字,定义一个接口. interface USB { void Read(string[ ...

  2. 安装配置BITS上传服务

    IIS 6.0和IIS 7.0 支持安装BITS上传组件. 下面以IIS7.0为例安装配置bits上传服务. 1.安装 首先确定服务器已经按装IIS服务.依次打开服务管理器->功能->添加 ...

  3. [C#学习笔记]你真的理解拆箱装箱吗?

    学习一项新知识的时候,最好的方法就是去实践它. 前言 <CLR via C#>这本神书真的是太有意思了!没错我的前言就是这个. 装箱 首先来看下,下面这段代码 可以看到,每次循环迭代都会初 ...

  4. 开发者常用的十款Chrome插件

    本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看 ...

  5. 「HAOI2010」 弹飞绵羊

    题目链接 戳我 \(Solution\) \(LCT\)裸题 我们首先先新建一个节\(n+1\)点,表示被弹飞 对于点\(i,link(i,min(n+1,i+k_i))\) 再看看修改: 现在要将点 ...

  6. python网络编程--操作系统介绍

    1.操作系统介绍 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两 ...

  7. leetcode 84. 柱状图中最大的矩形 JAVA

    题目: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高 ...

  8. 多实例mysql的安装和管理【验证通过】

    mysql的多实例有两种方式可以实现,两种方式各有利弊.第一种是使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便.第二种是通过官方自带的mysqld ...

  9. python文件备份与简单操作

    #!/usr/bin/python # -*- coding: utf-8 -*- # data:2018/8/30 # user:fei import sys import random num = ...

  10. 视频video遇到一些坑

    1.video层级最高问题 解决方案思路:当点击其他按钮触发事件时,视频层级挡住其他外层,比如会挡住弹窗,这是应该让视频暂停播放且隐藏,这是视频这个地方会空一个位置可以放一张封面占位,这样就解决视频层 ...