Ubuntu22.04上kdump和crash的使用

0.前言

1.引用:

解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云

解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云

ubuntu内核转储分析------kdump和crash的下载和使用_ubuntu kdump-CSDN博客

Ubuntu的Kdump_ubuntu22 kdump-CSDN博客

Index of /pool/main/l/linux

Linux下用火焰图进行性能分析_perf火焰图分析-CSDN博客

2.Ubuntu22.04安装 kdump

本小节主要参考了如下博文里的内容,在Ubuntu22.04上安装内核转存分析工具kdump。

ubuntu内核转储分析------kdump和crash的下载和使用_ubuntu kdump-CSDN博客

安装命令

bash 复制代码
sudo apt install linux-crashdump

配置kexec-tools

安装时,会弹框确认是否在崩溃时,通过 kexec-tools 快速重新启动到一个新的内核,以便进行崩溃信息的收集和分析。

这里选择Yes

如果选择了No,也可以手动启动

bash 复制代码
sudo dpkg-reconfigure kexec-tools 

这将修改/etc/init.d/kexec中的LOAD_KEXEC ,LOAD_KEXEC=true(未测试)

配置kdump-tools

上面的内容选择了Yes,接着继续弹出一个框,这里仍然选择Yes

如果选择了No,也可以手动启动

bash 复制代码
sudo dpkg-reconfigure kdump-tools

配置成功后生成的文件

安装成功后,将会在/etc/init.d中多了几个文件

kdump-tools

kexec

kexec-load

确认kdump-tool是否启用

bash 复制代码
sudo kdump-config show

如果未安装kdump,将会提示

kdump-config: command not found

如果安装了kdump-config, 将会提示:

* no crashkernel= parameter in the kernel cmdline

DUMP_MODE: kdump

USE_KDUMP: 1

KDUMP_SYSCTL: kernel.panic_on_oops=1

KDUMP_COREDIR: /var/crash

crashkernel addr:

/var/lib/kdump/vmlinuz

kdump initrd:

/var/lib/kdump/initrd.img

current state: Not ready to kdump

kexec command:

no kexec command recorded

如果是如上提示,需要把Ubuntu22.04系统给重启一下,重启之后再次执行命令。

bash 复制代码
sudo kdump-config show

命令输出结果显示kdump已经配置成功。

3.手动触发内核崩溃,生成转储文件

第一步:

bash 复制代码
sudo sh -c "echo 1 > /proc/sys/kernel/sysrq"

第二步

bash 复制代码
sudo sh -c "echo c > /proc/sysrq-trigger"

这里不直接使用sudo echo x > /proc/xxx/xxx/xxx的原因是使用它会报错Permission denied,是因为重定向符号 ">" 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,但是没有让 ">" 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。

其中echo 1 > /proc/sys/kernel/sysrq和echo c > /proc/sysrq-trigger是用来触发SysRq功能的命令。SysRq功能是一种种魔术系统请求键,可以让用户向内核发送一些特殊的命令,以获取或控制系统的信息或状态。

echo 1 > /proc/sys/kernel/sysrq向sysrq文件中写入1是为了开启SysRq功能(写入0是关闭SysRq功能),但是这需要内核支持(CONFIG_MAGIC_SYSRQ选项),它会让内核响应用户输入的任何操作,只要内核没有挂掉。此功能只是临时开启,重启后SysRq会自动关闭。如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后,此功能将会自动打开。

echo c > /proc/sysrq-trigger是用来触发故意让系统统崩溃(crash)命令的命令,它会让内核立即即崩溃,并且不会管你有没有数据没有写回回磁盘,也不卸载载磁盘,而是完完全全地关机。

执行后,等待系统重启,在/var/crush中会生成几个文件:

其中

  • kexec_cmd是默认就有的
  • dmesg.202401021909:这个文件是系统内核崩溃时的内核日志,它记录了内核崩溃的原因和上下文信息,可以用来分析内核崩溃的原因和过程。
  • dump.202401021909:这个文件是系统内核崩溃时的内核内存转储文件,它包含了内核崩溃时的内存状态,可以用来分析内核崩溃的现场和数据。
  • linux-image-3.13.0-24-generic-202401021909.crash:这个文件是系统内核崩溃时,使用apport命令来生成的崩溃报告文件,它包含了系统内核的版本和配置信息,以及内核崩溃的时间和环境信息,可以用来报告和追踪内核崩溃的问题。

补充知识一:sysrq的参数

  • b - 即时重新启动系统
  • o - 即时关机
  • s - 即时同步所有挂载的文件系统
  • u - 即时重新挂载所有的文件系统为只读
  • p - 导出当前CPU寄存器信息和标志位的信息
  • t - 导出线程状态信息
  • m - 导出关于内存分配的信息
  • c - 故意让系统统崩溃(在使用netdump或diskdump的时候有用)
  • e - 杀死所有进程除了init使用SIGTERM
  • i - 杀死所有进程除了init使用SIGKILL

当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages或/var/log/syslog。有时候,可能系统已无法响应,syslogd可能无法记录此信息。在这种情况下,建议你设置一个串口终端来收集这个信息。

4.获取Ubuntu22.04对应的vmlinx

查看是否存在vmlinux

bash 复制代码
ls //usr/lib/debug/boot

下载namelist

  • namelist是一个包含了内核调试符号的vmlinux内核镜像文件
  • 内核调试符号是指包含了调试信息的内核镜像文件,它可以帮助开发者或者分析者定位内核的错误或者性能问题。

下载namelist的方法可以参考我写的另一篇博文

获取Ubuntu-22.04.1 对应的vmlinux文件-CSDN博客

按照博文中的操作步骤获取到Ubuntu22.04对应的带有符号调试信息的 vmlinux文件,这个vmlinux文件就是我们使用 'crash' 工具分析内核cras 的 codedump 文件所需要的。

bash 复制代码
ls /usr/lib/debug/boot

5.使用crash工具分析内核coredump文件

相关推荐
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码2 天前
嵌入式学习路线
学习
毛小茛2 天前
计算机系统概论——校验码
学习
babe小鑫2 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms2 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下2 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。2 天前
2026.2.25监控学习
学习
im_AMBER2 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J2 天前
从“Hello World“ 开始 C++
c语言·c++·学习