文章目录
-
- [Crasg 功能概述](#Crasg 功能概述)
-
- [Crash 核心功能](#Crash 核心功能)
- [Crash 版本独立性](#Crash 版本独立性)
- [为什么使用 Crash 工具?](#为什么使用 Crash 工具?)
-
- [Crash 工具的优势](#Crash 工具的优势)
- [Crash 工具编译](#Crash 工具编译)
-
- [debug 信息保留](#debug 信息保留)
Crasg 功能概述
crash
工具是一个强大的 Linux 内核调试和分析工具,最初基于 SVR4 UNIX 的 crash
命令,但经过显著增强,完全与 GNU GDB 调试器结合在一起。这样的结合有效地将传统 UNIX crash
工具的内核特定特性与 GDB 的源代码级调试能力结合在一起。
crash
工具可以用于调查以下几种情况:
- 实时 Linux 系统:可以在系统运行时进行实时分析。
- Linux 内核核心转储:
- 通过
kdump
功能创建的转储。 - 通过
makedumpfile
命令创建的压缩内核核心转储。 - 通过 Red Hat Netdump 和 Diskdump 功能创建的核心转储。
- Xen 主机和客机的内核核心转储。
- KVM 客机的内核核心转储通过
virsh dump
创建。 - S390 和 S390x 架构的内核核心转储通过 IBM Standalone Core Dump 功能创建。
- 通过 LKCD SourceForge 项目创建的核心转储。
- 通过 Mission Critical Linux 提供的 MCORE 补丁创建的核心转储。
Crash 核心功能
crash
工具提供了一系列命令,用于进行常见的内核核心分析,例如:
- 内核堆栈回溯:获取所有进程的内核堆栈回溯。
- 源代码反汇编:可以查看内核的源代码级别的反汇编。
- 格式化显示内核结构和变量:可以查看内核结构体和变量的详细信息。
- 虚拟内存数据:分析和展示内核的虚拟内存使用情况。
- 链表转储:可以查看和转储内核中的链表结构。
此外,crash
工具还包括了许多深入探索特定内核子系统的命令,同时允许输入相关的 GDB 命令,这些命令会传递给 GDB 模块执行。
Crash 版本独立性
crash
工具设计为独立于 Linux 版本。当新的内核源代码影响到 crash
的正确功能和命令集时,该工具将会更新以识别新的内核代码变化,同时保持对早期版本的向后兼容性。这种设计使得 crash
成为一个非常灵活和强大的内核调试工具,能够适应多种 Linux 内核版本和配置。
典型应用:
在实际应用中,系统管理员和开发者可以使用 crash
工具进行以下操作:
- 诊断系统崩溃:通过分析核心转储,找出导致系统崩溃的原因。
- 调试内核模块:在开发和测试阶段,通过实时或转储分析方法调试内核模块。
- 性能分析:通过分析内核的行为,优化系统性能。
为什么使用 Crash 工具?
Linux 操作系统最初缺乏内置的、传统 UNIX 风格的内核崩溃转储功能。这一缺陷最早在 1999 年通过 Mission Critical Linux 的 MCORE 内核补丁和 SGI 的 LKCD(Linux Kernel Crash Dump)内核补丁得到了初步解决,随后在 2002 年通过 Red Hat 的 Netdump 功能和在 2004 年通过 Red Hat 的 Diskdump 功能进行了改进。最终,上游 Linux 社区在 2006 年决定采用 Kdump 作为标准的崩溃转储机制。
然而 ,生成内核崩溃转储文件只是解决问题的一半;还需要一个工具来识别转储文件格式,读取并提供一组有用的命令来解读它。此外,从用户空间检查实时系统的内核内部状况,唯一可用的选择是使用 GDB 处理 /proc/kcore
。虽然 GDB 是一个非常强大的工具,但它主要用于调试用户程序,对内核的了解并不全面。因此,仅使用 GDB 在查看内核内存时作用有限,基本上只能打印内核数据结构(前提是 vmlinux 文件是用 -g
C 标志构建的)、反汇编内核文本以及进行原始数据转储。此外,像 Red Hat Enterprise Linux 这样的发行版限制了对 /proc/kcore
的访问,使其无法用作内核内存源。
对于内核崩溃转储文件而言,Red Hat 的 Netdump 和未压缩的 Diskdump 功能,以及 Kdump 创建的转储文件是可被 GDB 读取的,但除了显示引起崩溃的任务的堆栈跟踪外,其功能与读取 /proc/kcore
时一样受限。此外,GDB 无法读取 LKCD、MCORE、Xen 或 s390/s390x 的转储文件。
在这种情况下,Crash 工具被开发出来,以方便地覆盖所有基于崩溃转储的分析需求,也包括所有列出的转储文件格式及实时系统。此外,它也被设计为易于扩展,以适应内核开发人员或分析人员的特定需求;内置命令集可以轻松扩展或增强,外部命令模块也可以编写并动态附加。
Crash 工具的优势
- 支持多种转储格式:Crash 能够处理多种内核崩溃转储格式,包括 Kdump、Netdump、Diskdump 等,以及特定硬件架构的转储文件,如 Xen 和 s390/s390x。
- 实时系统分析:不仅限于转储文件分析,Crash 还可以用于分析实时系统的内核状态。
- 扩展性:用户可以根据需求开发新的命令模块来扩展 Crash 的功能,以满足特定的调试和分析需求。
- 内核感知:与 GDB 不同,Crash 是专为内核分析设计的,它理解内核数据结构和内存布局,能够提供更丰富的内核调试信息。
Crash 工具编译
powershell
cd crash/crash-8.0.5$
make target=ARM64 -j32 //首次编译需要下载gdb源码
编译好后会生成文件如下:
debug 信息保留
vmlinux文件需要完整的debug_info,所以kernel编译前,需要再.config
里添加CONFIG_DEBUG_INFO_REDUCED=n
选项才可以,重新编译后,保存对应的vmlinux。