在Linux中安装Kdump调试环境

参考书:《Linux内核模块开发技术指南》

调试应用程序时,可以通过配置,以便在程序崩溃时产生coredump文件。coredump文件保存了程序崩溃前的内存状态、寄存器、栈等信息。使用gdb工具可以方便地查看这些信息,以帮助定位程序崩溃原因。同样,内核也有类似的机制,这种机制被称为kdump。

Linux内核在打开kdump功能时,如果内核发生崩溃,kdump会通过kexec工具启动到第二个内核,第二个内核通常叫做捕获内核(capture kernel)。该内核会生成一个内存映像(或被称为vmcore),这个内存映像类似于应用程序的coredump文件,但保存的是内核崩溃时的内存、寄存器、栈信息。可以对其进行分析,以用于确定崩溃原因。内核崩溃时生成的内存映像也被称为vmcore文件。

本文将介绍如何在CentOS 7.9安装Kdump调试环境。

1.确认编译内核选项已启动kdump功能

由于kdump功能需要Linux内核的支持,所以在编译内核时需要打开kdump相关的内核选项,这些选项包括:CONFIG_KEXEC、CONFIG_DEBUG_INFO、CONFIG_SYSFS、CONFIG_CRASH_DUMP、CONFIG_PROC_VMCORE。

通过查看内核源码根目录下的.config文件来确认这些选项是否已经打开。如下图所示:

图中的CONFIG_DEBUG_INFO=y表示CONFIG_DEBUG_INFO已打开,读者可以在这个文件中搜索选项CONFIG_KEXEC、CONFIG_SYSFS等其他选项是否已打开,默认情况下,kdump的相关选项是打开的。如果存在kdump的相关选项没有打开的情况,需要使用make menuconfig命令选择对应选项然后重新编译、安装内核。使用make menuconfig命令打开选项的步骤是:

• 译内核前,在Linux内核源码根目录下执行make menuconfig命令进入选项菜单。

• 以CONFIG_DEBUG_INFO为例,在选项菜单中搜索"CONFIG_DEBUG_INFO",搜索方式是:在选项菜单输入'/',进入搜索框,如下图所示:

在搜索框中输入"CONFIG_DEBUG_INFO"然后回车,可以看到CONFIG_DEBUG_INFO选项在选项菜单中的路径以及依赖选项,如下图所示:

图中的"Depends on"这一行是CONFIG_DEBUG_INFO的依赖选项,该选项依赖于DEBUG_KERNEL选项的打开以及COMPILE_TEST选项的关闭。"DEBUG_KERNEL"后的[=y]表示需要打开这个选项,"COMPILE_TEST"后的[=n]表示需要关闭这个选项。读者可以自行查看这两个选项是否正确。图中的"Location"及之后是CONFIG_DEBUG_INFO选项的路径信息,可以在选项菜单中通过路径找到CONFIG_DEBUG_INFO。回到选项菜单首页后,根据上图的路径信息,选择"Kernel hacking",然后敲击回车,如下图所示:

在子菜单下再选择"Compile-time checks and compiler options",进入下一级菜单后,可以看到选项"Compile the kernel with debug info",这个选项正是CONFIG_DEBUG_INFO选项,如下图所示:

图中选项前有''号,表示该选项已打开,如果选项前没有' '号,需要选中该选项,然后敲击字母'y',就可以打开这个选项。选项打开后,需要重新编译、安装内核。

关于kdump环境安装的详细介绍,也可以参考内核源码目录下的文件Documentation/admin-guide/kdump/kdump.rst。

2.配置捕获内核的内存空间大小

内核发生崩溃时,kdump会通过kexec工具启动到第二个内核,这个内核就是捕获内核。该内核也需要使用内存空间,所以需要配置其可使用的内存空间大小。

对于CentOS7.9系统,配置方法是:在/boot/grub2/grub.cfg文件中,修改内核启动参数的crashkernel,这个变量保存的就是捕获内核的内存空间大小。默认是crashkernel=auto,本节将其配置为768M内存大小,如下图:

因为使用的内核版本是5.10.179,所以图中是在"CentOS Linux (5.10.179)"启动菜单下配置的crashkernel参数。这个内存如果设置得太小,捕获内核可能无法成功启动。

3.安装依赖包

如果在CentOS7.9环境下安装,还需要安装依赖包,可以从https://pan.baidu.com/s/1vJKpAgV0l6UYCTjbHapAzg?pwd=29il下载依赖包kdump_rpm.tgz。这个压缩文件里保存了kdump环境的依赖软件。将该文件放入CentOS 7.9操作系统后,执行tar zxvf kdump_rpm.tgz进行解压缩,如下图:

执行命令rpm -Uvh --force --nodeps kdump_rpm/*。该命令用于安装解压后的软件,如下图所示:

4.安装kexec-tools工具

https://pan.baidu.com/s/1vJKpAgV0l6UYCTjbHapAzg?pwd=29il下载kexec-tools-2.0.22.tar.gz文件,这是kexec-tools的源码包。将该文件放入CentOS 7.9操作系统后,执行命令tar zxf kexec-tools-2.0.22.tar.gz,进行解压缩。解压缩完成后,会生成目录kexec-tools-2.0.22,通过cd命令进入该目录,执行过程如下图所示:

进入kexec-tools-2.0.22目录后,执行命令:./configure,配置编译参数,如下图:

执行命令make;make install进行源码的编译、安装,如下图所示:

完成安装后,执行命令:kexec -v。如果安装成功,将打印出kexec-tools的版本号。如下图:

5.安装makedumpfile工具

https://pan.baidu.com/s/1vJKpAgV0l6UYCTjbHapAzg?pwd=29il下载makedumpfile-1.6.7.tar.gz文件,这是makedumpfile的源码包。将该文件放入CentOS 7.9操作系统后,执行命令tar zxf makedumpfile-1.6.7.tar.gz,进行解压缩。解压缩完成后,会生成目录makedumpfile-1.6.7,通过cd命令进入该目录。

修改makedumpfile-1.6.7目录下的Makefile文件,删除"-static"语句,如下图所示:

删除上图的"-static"后保存Makefile文件,然后执行:make;make install。该命令用于编译、安装makedumpfile工具。安装完成后,可以通过命令makedumpfile -v查看makedumpfile的版本号,如下图所示:

6.使能kdump服务

将kdump服务设置为开机自启动,命令为:systemctl enable kdump。

7.生成crash工具

https://pan.baidu.com/s/1vJKpAgV0l6UYCTjbHapAzg?pwd=29il下载crash-master.zip文件,这是crash工具的源码包。将该文件放入CentOS 7.9操作系统后,执行命令unzip crash-master.zip,进行解压缩。解压缩完成后,会生成目录crash-master,通过cd命令进入该目录。

在crash-master目录下执行命令:make target=X86_64。命令中的X86_64指定编译后的crash将在X86的64位环境下使用。由于编译过程中会连接互联网下载依赖文件,所以需要保证编译环境能够连上互联网。编译完成后,在crash-master目录下会生成文件crash,该文件可用于查看vmcore文件。

重启操作系统,重启过程中需要选择之前新编译的内核启动。启动完成后,执行systemctl status kdump查看kdump服务的启动状态。如果刚安装完kdump环境,状态可能是activating,如下图所示:

如果状态是activating,表明kdump还在进行初始化,即使内核崩溃也无法产生vmcore文件。需要等待一会,直到kdump服务的状态是active,内核崩溃后就能够产生vmcore文件,正确的状态如下图:

相关推荐
闲猿类1 小时前
嵌入式第九天学习
linux·c语言·学习·算法·嵌入式
℡終嚸♂6802 小时前
红帽系统(RHEL 8/9)安装与配置Nginx全攻略
运维·chrome·nginx
TT哇2 小时前
【计算机网络】经典易错题 1.概述 2 物理层 3.数据链路层 4.网络层
android·服务器·计算机网络
CS_浮鱼2 小时前
【Linux】UDP
linux·udp
大侠课堂2 小时前
ARM Linux内核异常排查指南
linux·arm开发
DeeplyMind2 小时前
Linux Virtio 子系统核心数据结构解析
linux·驱动开发·virtio-gpu
人工智能训练2 小时前
在Windows系统Docker中使用wsl2、容器、windows文件路径三种不同挂载方式的区别和性能差异
运维·服务器·人工智能·windows·docker·容器·wsl2
贝塔实验室3 小时前
Altium Designer 6.0 初学教程-如何生成一个集成库并且实现对库的管理
linux·服务器·前端·fpga开发·硬件架构·基带工程·pcb工艺
yangmf20403 小时前
APM(三):监控 Python 服务链
大数据·运维·开发语言·python·elk·elasticsearch·搜索引擎