使用Crash工具分析 Linux dump文件

2023-11-07

前言

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来 获取。


http://blog.chinaunix.net/uid-20618535-id-70901.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Crash工具分析 Linux dump文件 的相关文章

  • Centos 7安装mysql

    1 安装前清理工作 1 1 1 清理原有的mysql数据库 使用以下命令查找出安装的mysql软件包和依赖包 rpm pa grep mysql 显示结果如下 mysql80 community release el7 1 noarch m
  • gethostbyname() -- 用域名或主机名获取IP地址

    http hi baidu com zengzhaonong item 87d9d296d0824cbb82d29570 include
  • Linux文件编程常用函数详解——exit()和_exit()函数

    两个函数的区别
  • linux中如何重新configure(或去除已configure的文件)

    linux中如何重新configure 或去除已configure的文件 linux中 在安装源码软件前 需要configure命令来进行安装配置 有时configure后需要重新configure 这时需要进行一些操作 已放置出错 以在f
  • 鼠标点击页面出现富强自由等文字JS特效

    在其他博客看到一款JS特效 感觉很不错 所有网上收集过来分享给大家 效果参考本网站 添加点击特效 点击页面会显示 富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善 把以下代码添加到当前主题的head php或foote
  • 中标麒麟QT中qDebug无输出问题解决办法

    一 系统环境 中标麒麟V5 qt creator 4 3 1 qt5 qtbase 5 6 2 二 问题 代码中qDebug 函数无输出 但qInfo 和qWarning 有输出 创建一个test工程 使用qDebug 打印信息 但是没有任
  • 七种Linux设备驱动模型之——Device

    前言 Linux将所有的设备统一抽象为struct device结构 同时将所有的驱动统一抽象为struct device driver结构 这样设计之后就方便驱动开发工程师编写驱动 只需要将具体的设备包含struct device结构 具
  • Linux内核分析:输入输出,字符与块设备 31-35

    CPU 并不直接和设备打交道 它们中间有一个叫作设备控制器 Device Control Unit 的组件 例如硬盘有磁盘控制器 USB 有 USB 控制器 显示器有视频控制器等 这些控制器就像代理商一样 它们知道如何应对硬盘 鼠标 键盘
  • slect( )、poll( )、epoll( )函数详解

    1 slect 函数 1 1 函数原型 include
  • 防止内存泄露 Linux下用Valgrind做检查

    用C C 开发其中最令人头疼的一个问题就是内存管理 有时候为了查找一个内存泄漏或者一个内存访问越界 需要要花上好几天时间 如果有一款工具能够帮助我们做这件事情就好了 valgrind正好就是这样的一款工具 Valgrind是一款基于模拟li
  • Centos7.4制作简易RPM包

    准备nginx 1 10 1 tar gz 准备php 7 1 7 tar bz2 这两个源码编译tar包 1 准备制作环境 yum y install rpm build 安装rpm build软件 rpmbuild ba xx spec
  • GDB调试子进程

    http blog sina com cn s blog 4e415c0b0100lum0 html 1 set follow fork mode
  • Linux系统下搭建(更新)cuda环境

    本人之前ubuntu系统装的是cuda8 因为模型需要升级cuda 因此重新装cuda10 安装和更新cuda和cudnn以及安装和更新显卡驱动 下面操作都适合 一 安装 升级 显卡驱动 升级cuda之前 先要升级显卡驱动 登陆网页http
  • gdb 的使用总结

    1 设置动态库的路径 set solib search path PATH 如果需要设置多个路径 则在PATH直接用 冒号分隔 set solib search path PATH1 PATH2
  • Linux slab 分配器剖析

    http www ibm com developerworks cn linux l linux slab allocator 了解 Linux 内存管理的方式 良好的操作系统性能部分依赖于操作系统有效管理资源的能力 在过去 堆内存管理器是
  • dracut 基本介绍

    dracut 基本介绍 dracut 维基 https dracut wiki kernel org index php Main Page http www 360doc com content 13 0428 09 12139495 2
  • begin to drop messages due to rate-limiting

    对于syslog保存的日志会有很多重要信息 但是一旦打印的日志数量超过设置的阈值 就会丢掉 imuxsock pid 48 begin to drop messages due to rate limiting 这是在调试时不愿看到的 可以
  • linux内核驱动开发笔试题

    linux内核驱动开发笔试题 一 一些常规中举的C考题 第一题 写出下述程序结果 int m 3 1 4 7 2 5 8 3 6 9 int i j k 2 for i 0 i lt 3 i printf d m k i 问题所在 本题考点
  • Linux shell中if [ $? -eq 0 ] 语句作用:判断命令是否执行成功

    shell脚本中 是指上一次命令执行的成功或者失败的状态 如果成功就是0 失败为1 语句if eq 0 是判断if语句的上一个命令执行如果成功就执行if中的语句 否则就执行else中的内容 note 使用时要注意 if后面的中括号 eq 0
  • 树莓派内核开发准备(内核源码获取、启动过程、源码目录树)

    目录 1 交叉编译工具的安装 2 内核源码获取 3 嵌入式设备带操作系统的启动过程扫盲 4 Linux内核源码树扫盲 1 内核源码简介 2 Linux内核源代码目录树结构 tree指令查看 内核源码目录树 1 交叉编译工具的安装 参照我之前

随机推荐

  • 准备写本书

    立个flag 写本书 关于数字IC物理设计 为了避免半途而废 本人在此立下flag 今天起 两年为期 写一本关于数字IC物理设计的书 初步想法 利用公众号专辑功能 先从小章节写起 然后汇聚成册 请大家监督 本来年初就想写 但是迟迟没下定决心
  • 服务器被爬虫恶意攻击怎么办?

    在有预算的情况可以采购第三方服务防火墙 没钱就使用开源的WAF进行防护 WAF防火墙的基本防护原理 WAF Web 应用防火墙 可以使用多种技术来防止恶意爬虫攻击 例如 1 黑名单 WAF 可以使用黑名单技术来过滤恶意爬虫的请求 黑名单中包
  • 【机器学习】TF-IDF以及TfidfVectorizer

    TF IDF定义 TF IDF 全称为 词频一逆文档频率 TF 某一给定词语在该文档中出现的频率 T F w 词语 w
  • common-lang包中一些工具类的使用说明

    一 common lang包常用的类有 1 StringUtils类 该类主要提供对字符串的操作 对null是安全的 主要提供了字符串查找 替换 分割 去空白 去掉非法字符等等操作 2 ObjectUtils类 主要是对null进行安全处理
  • vs网站 服务器变量,了解下变量赋值 (值 vs 引用)

    理解 JavaScript 如何给变量赋值可以帮助我们减少一些不必要的 bug 如果你不理解这一点 可能很容易地编写被无意中更改值的代码 JavaScript 总是按照值来给变量赋值 这一部分非常重要 当指定的值是 JavaScript 的
  • Qt的信号和槽是如何工作的

    用Qt做过开发的朋友 不知道是否曾为下面这些问题疑惑过 我们知道Qt是基于C 的 Qt写的代码最终还是要由C 编译器来编译 但是我们的Qt代码中有很多C 里没有的关键字 比如slots signals Q OBJECT等 为什么C 编译器会
  • mpvue页面卸载数据不清空

    mpvue有个坑页面卸载了 在小程序层面上是销毁了 但是vue层面页面的实例还在 为了实现再次进入清除数据的效果 可以试一下这个折中的办法 在onload里面清除一下实例中的数据 onLoad e Object assign this th
  • Leaflet使用wfs的示例

    Leaflet是一个开源的Web地图库 可以用来在网站上显示地图 可以使用Leaflet的功能扩展 Leaflet WFS 来在Leaflet地图中使用WFS Web Feature Service 功能 以下是使用Leaflet和Leaf
  • java是值传递还是引用传递

    文章目录 1 前言 2 java是值传递还是引用传递 1 前言 java是值传递 值传递是指在调用方法时将实际参数拷贝一份传递到方法中 这样在方法中如果对参数进行修改 将不会影响到实际参数 当传的是基本类型时 传的是值的拷贝 对拷贝变量的修
  • 内存溢出(out of memory)和内存泄露(memory leak)的区别和检测工具方法

    内存溢出 out of memory 是指程序在申请内存时 没有足够的内存空间供其使用 出现out of memory 比如申请了一个integer 但给它存了long才能存下的数 那就是内存溢出 内存泄露 memory leak 是指程序
  • 如何快速使用上C++11

    最近的几个项目都是用C 11写的 越用越觉得强大 很多的新特征也希望Java能整合进去就好了 打算改天有空也写个C 11的使用心得 无奈C 太博大精深 还有好几个很赞的功能还没掌握 现在试着在本机Ubuntu上使用C 11 找了好几种方法
  • 喜讯

    近日 中国信息通信研究院 以下简称 中国信通院 主办的首届 SecGo云和软件安全大会 成功举办 会上重磅揭晓了 安全守卫者计划 零信任 优秀案例征集活动结果 深圳市智安网络有限公司与大庆油田信息技术公司联合申报的零信任项目 凭借为企业提供
  • row_number() over partition by 分组聚合

    row number over partition by 分组聚合 分组聚合 就是先分组再排序 可以的话顺手标个排名 如果不想分组也可以排名 如果不想分组同时再去重排名也可以 ROW NUMBER OVER PARTITION BY col
  • Vue获得指定id的html,vue.js怎么删除指定id的数据

    本文环境 windows7 vue2 9 6 该方法适用于所有品牌的电脑 vue js删除指定id数据的方法 注意click需要传入当前的id值deletes function id this http delete http jsonpl
  • 认识sass

    一 认识sass SASS Syntactically Awesome Stylesheet 是一个CSS预处理器 有助于减少CSS的重复 节省时间 它是更稳定和强大的CSS扩展语言 描述文档的样式干净和结构 扩展了 CSS3 增加了规则
  • Java面向对象基础

    面向对象 学习内容 l 面向对象思想 l 类与对象及其使用 l 对象的内存图 l 成员变量和局部变量的区别 l 匿名对象 l 封装 private l this关键字 l 构造方法 l static关键字 l 继承 l 多态 l 抽象类 l
  • AVR单片机最小系统 基本硬件线路与分析

    AVR单片机最小系统 基本硬件线路与分析 AVR仿真器 AVR编程器 二合一 AVR JTAG与ISP 二合一V2 5 经典推荐 298 00元 富士通 MB90092 DEMO OSD视频字符叠加开发板 380 00元 国产 AVR JT
  • Wireshark使用技巧

    前言 Wireshark是一款图形界面的网络嗅探器 支持多种平台 是网络流量分析的利器 它的创始人是Gerald Combs 前身是Ethereal 作为开源项目经过众多开发者的完善它已经成为使用量最大的安全工具之一 最近刚把 Wiresh
  • 翰文进度计划软件横道图不显示文字_斑马进度计划2019,编制进度计划仅需8步!请收藏...

    斑马进度计划2019新功能简介 大突破 从此双代号网络计划支持父子结构啦 计划分分钟逐级拆解细化 前锋线也能自下而上反馈进度 进行多级管控里程碑预警啦 还有大家最心心念的TPM 全面计划管理 设计 招采 施工以及各专业全面联动计算 从此 项
  • 使用Crash工具分析 Linux dump文件

    前言 Linux 内核 以下简称内核 是一个不与特定进程相关的功能集合 内核的代码很难轻易的在调试器中执行和跟踪 开发者认为 内核如果发生了错误 就不应该继续运 行 因此内核发生错误时 它的行为通常被设定为系统崩溃 机器重启 基于动态存储器