【Linux工具系列】专栏是为开发者提供Linux工具在内存管理、调度优化、CPU等方面的优质清单。本期是带来Crash-Utility工具,通过对基础概念和使用方法的介绍和分享,让您全方位了解Crash-Utility的特性及使用场景。
1 什么是Crash-Utility?
Crash-Utility是一个开源工具,专门用于分析和调试Linux内核崩溃时生成的coredump文件(通常称为vmcore)。当Linux内核发生严重错误(如panic或oops)时,系统会生成一个内核转储文件,记录崩溃时的内存状态、寄存器信息、堆栈信息等。Crash-Utility可以帮助开发者通过这些转储文件,快速定位内核崩溃的原因。
2 基本使用
1. 安装Crash-Utility
集成GDB功能是从8.0.6版本开始支持的,因此选择编译源码包进行安装:
编译安装方法:
gitclone
cdcrash
make
sudomakeinstall
2. 典型使用步骤
1)系统安装kdump服务,用于在内核崩溃时产生vmcore:
yuminstallkexec-tools
systemctlrestartkdump
2) 安装内核debug包
yuminstallkernel-debuginfo
3)加载转储文件
crash/usr/lib/debug/lib/modules/$(uname-r)/vmlinux/var/crash/<vmcore-file>
3. Crash-Utility使用实例
使用echo c > /proc/sysrq-trigger模拟系统崩溃,产生vmcore
加载转储文件:
crash /usr/lib/debug/lib/modules/5.10.134-15.2.15.kos5.x86_64/vmlinux\
/var/crash/127.0.0.1-2024-12-06-14\:30\:47/vmcore
具体显示如下:

切换进程上下文
命令:set #pid
切换进程上下文,命令后面跟进程PID号,并且可以通过task子命令加上TASK地址进程查看当前任务相关信息:

查看堆栈信息
命令:gdb bt
通过crash调试vmcore时,打印堆栈信息:执行命令bt,打印如下:

通过crash-utility进行调试时,打印堆栈信息:执行命令:gdb bt

可以看出两者打印会有一些不同,以gdb模式更能够清楚的表示出当前堆栈信息,能够更加清晰的指示出当前出问题的代码位置,就像调试用户态程序一样,不再需要通过反汇编等复杂的手段定位问题位置。
切换栈帧
命令:gdb frame#framenum
切换到指定栈帧,命令后面跟栈帧号。切换到具体的栈帧后可以通过gdb命令进行代码调试,比如使用命令"l"查看当前代码。

查看局部变量
命令:gdb info locals
在调试时避免不了要查看某个函数的局部变量值是多少,通过命令gdb info locals会打印当前栈帧时的一些局部变量值。

查看函数参数值
命令:gdb info args
查看函数参数,执行gdb info args会打印当前栈帧时函数的参数值。

查看栈帧信息
命令:gdb info frame

栈帧滚动
命令:gdb up/down
栈帧滚动:上一帧/下一帧

切换GDB模式
命令:set gdb on/off
开启gdb模式/关闭gdb模式,开启gdb模式的情况下可以使用gdb的一些命令,像调试用户态程序一样调试内核,进入gdb模式后调试窗口是gdb>开头的;
比如查看堆栈:输入bt,同普通模式下使用gdb bt效果一样:

动态加载内核模块
命令:mod
通过help mod命令可以显示mod的具体用法以及示例;
比如显示内核模块加载信息:mod -S
加载内核模块:mod -s模块名称,注意,如果不指定内核模块搜索路径,默认是从/usr/lib/debug/lib/modules/下搜索模块,如果想从指定路径下加载模块可以通过“mod -s模块名称 路径”

查看内核数据结构或符号定义的子命令
命令:whatis
用于查看内核数据结构或符号定义的子命令,可通过help whatis查看具体子命令用法。比如查看regs变量类型:whatis regs

4. 基本命令汇总

3 特性及应用场景分析
支持多种转储文件格式:
Crash-utility支持多种工具生成的转存文件格式,包括:
Kdump:Linux内核自带的崩溃转储工具。
LKCD(Linux Kernel Crash Dump):一种早期的内核转储工具。
netdump和diskdump:通过网络或磁盘生成的内核转储文件。
这意味着它不仅可以分析虚拟机上生成的内核转存文件,还可以分析物理机或其他设备上生成的文件。
与GDB集成:
Crash-utility与GDB(GNU调试器)进行了集成,能够利用GDB的强大调试功能来分析内核转储文件。通过GDB集成,开发者可以像调试用户态程序一样调试内核,查看堆栈、局部变量、函数参数等信息。
广泛的应用场景:
Crash-utility不仅限于分析内核崩溃问题。它还可以用于调试运行时系统、分析内核性能问题、查找内核中的漏洞等。因此,Crash-utility在多种场景下都具有广泛的应用价值。
售前咨询
售后服务
回到顶部