Linux crash工具

  • 格式:docx
  • 大小:40.12 KB
  • 文档页数:13

什么是 crash

如前文所述,当 linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成一个转储文件 vmcore。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。那么 crash 就是一个被广泛使用的内核崩溃转储文件分析工具,掌握 crash 的使用技巧,对于定位问题有着十分重要的作用。

回页首

使用 crash 的先决条件

由于 crash 用于调试内核崩溃的转储文件,因此使用 crash 需要依赖如下条件:

1. kernel 映像文件 vmlinux 在编译的时候必须指定了 -g 参数,即带有调试信息。

2. 需要有一个内存崩溃转储文件(例如 vmcore),或者可以通过 /dev/mem 或

/dev/crash 访问的实时系统内存。如果 crash 命令行没有指定转储文件,则 crash 默认使用实时系统内存,这时需要 root 权限。

3. crash 支持的平台处理器包括:x86, x86_64, ia64, ppc64, arm, s390, s390x ( 也有部分 crash 版本支持 Alpha 和 32-bit PowerPC,但是对于这两种平台的支持不保证长期维护 )。

4. crash 支持 2.2.5-15(含)以后的 Linux 内核版本。随着 Linux 内核的更新,crash

也在不断升级以适应新的内核。

回页首

crash 安装指南

要想使用 crash 调试内核转储文件,需要安装 crash 工具和内核调试信息包。不同的发行版安装包名称略有差异,这里仅列出 RHEL 和 SLES 发行版对应的安装包名称如下:

表 1. crash 工具和内核调试包

系统版本 crash 工具名称 内核调试信息包

RHEL6.2 crash kernel-debuginfo-common

kernel-debuginfo

SLES11SP2 crash kernel-default-debuginfo

kernel-ppc64-debuginfo

以 RHEL 为例,安装 crash 及内核调试信息包的步骤如下:

rpm -ivh crash-5.1.8-1.el6.ppc64.rpm

rpm -ivh kernel-debuginfo-common-ppc64-2.6.32-220.el6.ppc64.rpm

rpm -ivh kernel-debuginfo-2.6.32-220.el6.ppc64.rpm

回页首

启动 crash

启动参数说明

使 用 crash 调试转储文件,需要在命令行输入两个参数:debug kernel 和 dump file,其中 dump file 是内核转储文件的名称,debug kernel 是由内核调试信息包安装的,不同的发行版名称略有不同,以 RHEL 和 SLES 为例:

RHEL6.2:/usr/lib/debug/lib/modules/2.6.32-220.el6.ppc64/vmlinux

SLES11SP2:/usr/lib/debug/boot/vmlinux-3.0.13-0.27-ppc64.debug

使用 crash -h 或 man crash 可以查看 crash 支持的一系列选项,这里仅以常用的选项为例说明如下:

-h:打印帮助信息

-d:设置调试级别

-S:使用 /boot/System.map 作为默认的映射文件

-s:不显示版本、初始调试信息等,直接进入命令行

-i file:启动之后自动运行 file 中的命令,再接受用户输入

crash 报告分析

crash 命令启动后,会产生一个转储文件的分析报告摘要,如下图所示。

清单 1. crash 报告

[root@curlylp1 ~]# crash

crash 5.1.8-1.el6

Copyright (C) 2002-2011 Red Hat, Inc.

Copyright (C) 2004, 2005, 2006 IBM Corporation Copyright (C) 1999-2006 Hewlett-Packard Co

Copyright (C) 2005, 2006 Fujitsu Limited

Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.

Copyright (C) 2005 NEC Corporation

Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.

Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.

This program is free software, covered by the GNU General Public

License,

and you are welcome to change it and/or distribute copies of it under

certain conditions. Enter "help copying" to see the conditions.

This program has absolutely no warranty. Enter "help warranty" for

details.

GNU gdb (GDB) 7.0

Copyright (C) 2009 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show

copying"

and "show warranty" for details.

This GDB was configured as "powerpc64-unknown-linux-gnu"...

KERNEL: /usr/lib/debug/lib/modules/2.6.32-220.el6.ppc64/vmlinux

DUMPFILE: /dev/mem

CPUS: 2

DATE: Thu Feb 2 00:31:34 2012

UPTIME: 58 days, 22:52:43

LOAD AVERAGE: 76.11, 77.40, 77.83

TASKS: 481

NODENAME:

RELEASE: 2.6.32-220.el6.ppc64

VERSION: #1 SMP Wed Nov 9 08:02:37 EST 2011

MACHINE: ppc64 (5009 Mhz)

MEMORY: 4 GB

PID: 30510

COMMAND: "crash"

TASK: c00000006ddbe460 [THREAD_INFO: c000000073268000]

CPU: 0

STATE: TASK_RUNNING (ACTIVE)

crash>

KERNEL: 系统崩溃时运行的 kernel 文件

DUMPFILE: 内核转储文件

CPUS: 所在机器的 CPU 数量

DATE: 系统崩溃的时间

TASKS: 系统崩溃时内存中的任务数 NODENAME: 崩溃的系统主机名

RELEASE: 和 VERSION: 内核版本号

MACHINE: CPU 架构

MEMORY: 崩溃主机的物理内存

PANIC: 崩溃类型,常见的崩溃类型包括:

SysRq (System Request):通过魔法组合键导致的系统崩溃,通常是测试使用。通过

echo c > /proc/sysrq-trigger,就可以触发系统崩溃。

oops: 可以看成是内核级的 Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到 Segfault 信号,一般行为是 coredump,应用程序也可以自己截获 Segfault 信号,自行处理。如果内核自己犯了这样的错误,则会弹出

oops 信息。

回页首

crash 内置命令简介

crash 命令行启动后,可以通过一些内置命令来打印系统崩溃前的信息。

bt - backtrace

bt 命令用于查看系统崩溃前的堆栈等信息,这是系统调试中非常常用和好用的一个命令。

清单 2. bt 命令结果

crash> bt

PID: 2860 TASK: c0000000677e9550 CPU: 0 COMMAND: "bash"

R0: 0000000000000001 R1: c0000000018978b0 R2:

c00000000061c460

R3: c000000001897920 R4: 0000000000000000 R5:

0000000000000000

R6: 0000000000019e07 R7: 0000000000000000 R8:

000000000a000000

R9: c000000072938d80 R10: c0000000006b5d58 R11:

c000000000740178

R12: 0000000000000000 R13: c00000000054ea80 R14:

00000000100d0000

R15: 0000000000000000 R16: 00000000100e2ab8 R17:

00000000100b0000