`
netcome
  • 浏览: 479849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 Crash 工具分析 Linux dump 文件

阅读更多

前言

Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果发生了错误,就不应该继续运行。因此内核发生错误时,它的行为通常被设定为系统崩溃,机器重启。基于动态存储器的电气特性,机器重启后,上次错误发生时的现场会遭到破坏,这使得查找内核的错误变得异常困难。

内核社区和一些商业公司为此开发了很多种调试技术和工具,希望可以让内核的调试变得简单。其中一种是单步跟踪调试方法,即使用代码调试器,一步步的跟踪执行的代码,通过查看变量和寄存器的值来分析错误发生的原因。这一类的调试器有 gdb,kdb, kgdb。另一种方法是在系统崩溃时,将内存保存起来,供事后进行分析。多数情况下,单步调式跟踪可以满足需求,但是单步跟踪调试也有缺点。如遇到如下几种情况时:

  • 错误发生在客户的机器上。
  • 错误发生在很关键的生产机器上。
  • 错误很难重现。

单步调试跟踪方法将无能为力。对于这几种情况,在内核发生错误并崩溃的时候,将内存转储起来供事后分析就显得尤为重要。本文接下来将介绍内核的内存转储机制以及如何对其进行分析。

内核的内存转储机制

由于 Linux 的开放性的缘故,在 Linux 下有好几种内存转储机制。下面将对它们分别做简要的介绍。

LKCD

LKCD(Linux Kernel Crash Dump) 是 Linux 下第一个内核崩溃内存转储项目,它最初由 SGI 的工程师开发和维护。它提供了一种可靠的方法来发现、保存和检查系统的崩溃。LKCD 作为 Linux 内核的一个补丁,它一直以来都没有被接收进入内核的主线。目前该项目已经完全停止开发。

Diskdump

Diskdump 是另外一个内核崩溃内存转储的内核补丁,它由塔高 (Takao Indoh) 在 2004 年开发出来。与 LKCD 相比,Diskdump 更加简单。当系统崩溃时,Diskdump 对系统有完全的控制。为避免混乱,它首先关闭所有的中断;在 SMP 系统上,它还会把其他的 CPU 停掉。然后它校验它自己的代码,如果代码与初始化时不一样。它会认为它已经被破坏,并拒绝继续运行。然后 Diskdump 选择一个位置来存放内存转储。Diskdump 作为一个内核的补丁,也没有被接收进入内核的主线。在众多的发行版中,它也只得到了 RedHat 的支持。

Netdump

RedHat 在它的 Linux 高级服务器 2.1 的版本中,提供了它自己的第一个内核崩溃内存转储机制:Netdump。 与 LKCD 和 Diskdump 将内存转储保存在本地磁盘不同,当系统崩溃时,Netdump 将内存转储文件通过网络保存到远程机器中。RedHat 认为采用网络方式比采用磁盘保的方式要简单,因为当系统崩溃时,可以在没有中断的情况下使用网卡的论询模式来进行网络数据传送。同时,网络方式对内存转储文件提供了更好的管理支持。与 Diskdump 一样,Netdump 没有被接收进入内核的主线,目前也只有 RedHat 的发行版对 Netdump 提供支持。

Kdump

Kdump 是一种基于 kexec 的内存转储工具,目前它已经被内核主线接收,成为了内核的一部分,它也由此获得了绝大多数 Linux 发行版的支持。与传统的内存转储机制不同不同,基于 Kdump 的系统工作的时候需要两个内核,一个称为系统内核,即系统正常工作时运行的内核;另外一个称为捕获内核,即正常内核崩溃时,用来进行内存转储的内核。 在本文稍后的内容中,将会介绍如何设置 kump。

MKdump

MKdump(mini kernel dump) 是 NTT 数据和 VA Linux 开发另一个内核内存转储工具,它与 Kdump 类似,都是基于 kexec,都需要使用两个内核来工作。其中一个是系统内核;另外一个是 mini 内核,用来进行内存转储。与 Kdump 相比,它有以下特点:

  • 将内存保存到磁盘。
  • 可以将内存转储镜像转换到 lcrash 支持格式。
  • 通过 kexec 启动时,mini 内核覆盖第一个内核。

各种内存转储分析工具

与具有众多的内存转储机制一样,Linux 下也有众多的内存转储分析工具,下面将会逐一做简单介绍。

Lcrash

Lcrash 是随 LKCD 一起发布的一个内内存储分析工具。随着 LKCD 开发的停止,lcrash 的开发也同时停止了。目前它的代码已经被合并进入 Crash 工具中。

Alicia

Alicia (Advanced Linux Crash-dump Interactive Analyzer,高级 Linux 崩溃内存转储交互分析器 ) 是一个建立在 lcrash 和 Crash 工具之上的一个内存转储分析工具。它使用 Perl 语言封装了 Lcrash 和 Crash 的底层命令,向用户提供了一个更加友好的交互方式和界面。Alicia 目前的开发也已经停滞。

Crash

Crash 是由 Dave Anderson 开发和维护的一个内存转储分析工具,目前它的最新版本是 5.0.0。 在没有统一标准的内存转储文件的格式的情况下,Crash 工具支持众多的内存转储文件格式,包括:

  • Live linux 系统
  • kdump 产生的正常的和压缩的内存转储文件
  • 由 makedumpfile 命令生成的压缩的内存转储文件
  • 由 Netdump 生成的内存转储文件
  • 由 Diskdump 生成的内存转储文件
  • 由 Kdump 生成的 Xen 的内存转储文件
  • IBM 的 390/390x 的内存转储文件
  • LKCD 生成的内存转储文件
  • Mcore 生成的内存转储文件

使用 Crash 分析内存转储文件的例子

通过前面的学习,你现在可能已经跃跃欲试了。本文接下来的部分,将以 kdump 为例子,向大家演示如何设置系统、如何产生内存转储文件以及如何对内存转储文件进行分析。

kdump 的安装设置

如前面所述,支持 kdump 的系统使用两个内核进行工作。目前一些发行版,如 RedHat 和 SUSE 的 Linux 都已经编译并设置好这两个内核。如果你使用其他发行版的 Linux 或者想自己编译内核支持 kdump,那么可以根据如下介绍进行。

安装 kexec

  1. 使用 root 用户登录系统。
  2. 使用 wget 从 Internet 上下载 kexec。
    wget http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/\
     kexec-tools.tar.gz 
    

  3. 解压并安装 kexec 到系统中。
     # tar xvpzf kexec-tools.tar.gz 
     # cd kexec-tools-VERSION 
     # ./configure 
     # make && make install 
    

配置系统内核和捕捉内核都需要的内核选项:

  • 在 "Processor type and features."选项中启用"kexec system call"。
     CONFIG_KEXEC=y 
    

  • 在"Filesystem" -> "Pseudo filesystems." 中启用"sysfs file system support"。
     CONFIG_SYSFS=y 
    

  • 在"Kernel hacking."中启用"Compile the kernel with debug info"。
     CONFIG_DEBUG_INFO=Y 
    

配置捕捉内核的与架构无关的选项:

  • 在"Processor type and features"中启用"kernel crash dumps"。
     CONFIG_CRASH_DUMP=y 
    

  • 在"Filesystems" -> "Pseudo filesystems"中启用"/proc/vmcore support"。
     CONFIG_PROC_VMCORE=y 
    

配置捕捉内核的与架构相关的选项:

Linux 内核支持多种 CPU 架构,这里只介绍捕捉内核在 i386 下的配置

  • 在"Processor type and features"中启用高端内存支持。
     CONFIG_HIGHMEM64G=y 
    

  • 在"Processor type and features"中关闭多处理器支持。
     CONFIG_SMP=n 
    

  • 在"Processor type and features"中启用"Build a relocatable kernel"。
     CONFIG_RELOCATABLE=y 
    

  • 在"Processor type and features"->"Physical address where the kernel is loaded"中,为内核设置一个加载起始地址。在大多数的机器上,16M 是一个合适的值。
     CONFIG_PHYSICAL_START=0x1000000 
    

加载新的系统内核

  1. 编译系统内核和捕捉内核。
  2. 将重新编译好的内核添加到启动引导中,注意不要将捕捉内核添加到启动引导菜单中。
  3. 给系统内核添加启动参数"crashkernel=Y@X",这里,Y 是为 dump 捕捉内核保留的内存,X 是保留部分内存的开始位置。在 i386 的机器上,设置"crashkernel=64M@16M"。
  4. 重启机器,在启动菜单中选择新添加的启动项,启动新的系统内核。

加载捕捉内核

在系统内核引导完成后,需要将捕捉内核加载到内存中。使用 kexec 工具将捕捉内核加载到内存:

 # kexec -p <dump-capture-kernel-bzImage> \ 
  --initrd=<initrd-for-dump-capture-kernel> \ 
  --append="root=<root-dev> <arch-specific-options>"

 

触发内核崩溃

在捕捉内核被加载进入内存后,如果系统崩溃开关被触发,则系统会自动切换进入捕捉内核。触发系统崩溃的开关有 panic(),die(),die_nmi() 内核函数和 sysrq 触发事件,可以使用其中任意的一个来触发内核崩溃。不过,在让内核崩溃之前,我们还需要做一些安装设置。

Crash 工具的安装设置

Crash 目前的最新的版本是 5.0.0, 你可以从它的官方网站下载最新的版本。下载完成后对其进行解压安装。

 # tar -zvxf crash-5.0.0.tar.gz 
 # cd crash-5.0.0 
 # ./configure 
 # make &&make install 

 

生成内存转储文件

现在已经设置好 Kdump 和 crash,现在可以使用前面介绍的系统崩溃开关中的任意一个来引发系统崩溃来生成一个内存转储文件,并可以使用 crash 对其进行分析。

首先,触发系统崩溃,这里使用 sysrq 触发事件。

 # echo c > /proc/sysrq-trigger 

 

紧接着,系统会自动启动捕捉内核。待完全启动进入捕捉内核后,通过以下命令保存内存转储文件。

 # cp /proc/vmcore mydumpfile 

 

将在当前目录生成一个 mydumpfile 文件。

分析内存转储文件

现在有了一个内存转储文件,接下来使用 crash 对其进行分析

 # crash vmlinux mydumpfile 

 

这里 vmlinux 是带调试信息的内核。如果一切正常,将会进入到 crash 中,如图 1 所示。


图 1. crash 命令提示符
图片示例

在该提示符下,可以执行 crash 的内部命令。通过 crash 的内部命令,可以查看寄存器的值、函数的调用堆栈等信息。在图 2 中,显示了执行 bt命令后得到的函数调用的堆栈信息。


图 2. 函数调用堆栈信息
图片示例

crash 使用 gdb 作为它的内部引擎,crash 中的很多命令和语法都与 gdb 相同。如果你曾经使用过 gdb,就会发现 crash 并不是很陌生。如果想获得 crash 更多的命令和相关命令的详细说明,可以使用 crash 的内部命令 help来获取。

后记

本文介绍了 Linux 下的各种内存转储机制,以及如何 crash 工具开对内存转储文件进行分析。内核虽然复杂,但通过结合使用内核的内存转储文件和 crash 分析工具,可以轻松的找到内核问题的所在。通过对这篇文章的学习,相信你也可以像一个专业的内核开发者那样去追踪和修复内核的错误了。

Linux专区

 

分享到:
评论

相关推荐

    玩了一次linux的crash工具。真TMD牛逼.docx

    Linux Crash 工具是一款强大的调试工具,可以对 Linux 系统进行Dump 文件分析和崩溃日志分析。在本文中,我们将详细介绍如何使用 Crash 工具对 Linux 系统进行分析,并对背光设备结构体进行深入分析。 一、使用 ...

    高通crash分析工具

    高通crash分析工具是针对qualcomm处理器设计的一款故障排查工具,它的主要功能是解析系统dump文件,这些文件通常是在系统异常崩溃时生成的。通过分析这些dump文件,开发者可以获取到设备崩溃时的内存状态、进程信息...

    coredump文件调试

    Core Dump 文件的产生是由于进程收到某个信号的时候,Linux 上现在大概有 60 多个信号,可以使用 kill -l 命令全部列出来。常见的信号包括 SIGSEGV、SIGILL、SIGFPE、SIGBUS 等。这些信号通常是由于数组越界、空指针...

    A Quick Overview of Linux Kernel Crash Dump Analysis

    本文将对Linux内核崩溃转储分析进行快速概览,包括必要的先决条件、安装crash工具的方法以及如何利用它来获取崩溃转储文件中的关键信息。 #### 二、重要先决条件 为了能够使用Red Hat Crash Utility进行有效的崩溃...

    使用GDB分析Android Crash问题

    软件是人思维的产物。智者千虑,必有一失,人的思维总有缺陷,反映到软件层面上就是程序 bug。...通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

    javacore文件及heapdump文件分析

    heapdump 文件可以帮助我们分析系统是否存在内存溢出的情况,通过 heap analyzer 工具可以简单地分析出溢出的位置。 这两个文件也可以手工生成,在 unix/linux 上,可以使用 ps -ef|grep java 命令找到 Java 进程 ...

    crash 工具源码

    crash工具是Linux内核调试的重要工具,它允许开发者在内核崩溃时获取内存转储(core dump)并进行深入分析。本文将围绕"crash工具源码"这一主题,详细阐述其在arm 32位平台上的构建过程及应用,旨在帮助读者理解其...

    window COREdump文件生成 c++代码

    - 使用调试工具,如Visual Studio的调试器或第三方工具WinDbg,加载Coredump文件进行分析。 - 分析堆栈信息,查看崩溃时的函数调用序列,找出导致崩溃的原因。 - 查看内存数据,获取程序状态,如变量值、内存分配...

    Linux下Qt生成dump文件并定位bug(基于qBreakpad)

    在本教程中,我们将介绍如何在Linux下使用Qt结合qBreakpad库来生成dump文件,并进一步进行bug定位。 首先,qBreakpad是Qt平台上一个用于处理崩溃信息的开源库,它提供了捕获和分析崩溃堆栈的能力。qBreakpad的工作...

    Linux Kernel Crash Book.pdf

    3. **Crash Dump分析**:当Linux内核发生崩溃时,通常会产生一个名为“crash dump”的内存转储文件。这本书将指导读者如何解读这些文件,包括内存布局、进程状态、内核堆栈信息等,以分析导致崩溃的具体原因。 4. *...

    Linux Kernel Crash Debug

    本文将详细介绍如何使用`crash`工具来对Linux内核崩溃问题进行诊断和解决。 首先,我们需要了解`crash`工具的几个基本前提条件: 1. 内核对象文件:即`vmlinux`文件,它包含了内核的编译后的对象代码。在Red Hat ...

    jvm crash的崩溃日志详细分析及注意点

    `-XX:+ShowMessageBoxOnError`参数在Linux环境下启用后,当JVM崩溃时,系统会自动启动GDB进行分析和调试,这对于测试环境尤其有用。 JVM崩溃日志中的关键部分包括: 1. **错误信息概要**:这部分包含致命错误的...

    通过按键触发ramdump

    5. **分析ramdump**:一旦ramdump文件生成,可以使用工具如`kdump-tools`或`sysrqd`进行分析。这些工具可以帮助我们解码内存映像,查找崩溃时的栈回溯、内核线程状态等信息。 6. **安全考虑**:由于ramdump包含了...

    breakpad,可以直接使用的工具库(Linux)

    Breakpad库不仅包含了核心的崩溃处理功能,还提供了一些辅助工具,如`crash_dump_server`用于接收和存储崩溃转储,`.symstore`用于管理符号文件等。对于大型分布式系统或者需要高度稳定性的应用,Breakpad是一个非常...

    Crash问题分析,总结objdump使用方式

    在 Crash 问题分析中,我们可以使用 objdump 工具来dump 崩溃的进程的内存信息,然后对内存信息进行分析,找到崩溃的原因。 Crash 问题分析和 objdump 使用方式是软件开发和测试中非常重要的一部分,对于提高软件...

    Kexec,Linux kernel dump

    - 这些核心文件可以使用诸如 gdb 等工具进行分析。 2. **操作系统崩溃转储**: - 当操作系统本身崩溃时,也需要分析其崩溃前的状态。 - 但是由于崩溃的是操作系统本身,因此无法使用常规手段收集内存转储。 - ...

    Qt+mingw发布程序的异常crash信息捕捉和跟踪(含测试代码)

    6. **分析dump文件**:有了dump文件后,使用调试工具加载它,查看堆栈跟踪,确定崩溃的具体位置,分析变量状态,了解导致崩溃的原因。这一步可能需要对调试技术有深入的理解。 通过以上步骤,你将能够有效地捕获和...

    crash-1.3.2.zip

    这个工具在IT行业中主要用于分析和调试Linux内核崩溃问题,是系统管理员和内核开发者的重要助手。让我们深入探讨一下"crash"工具及其在源码层面的相关知识。 "crash"是一个强大的命令行工具,它允许用户在系统崩溃...

    Linux-crash-book_kdump.7z

    《Linux-crash-book_kdump》是一本专注于讲解Linux系统崩溃分析工具kdump的详细指南。kdump是Linux内核的一项功能,它允许在系统发生致命错误或蓝屏时捕获内核内存转储,以便后续分析和调试。下面将深入探讨kdump的...

Global site tag (gtag.js) - Google Analytics