测试环境、配置
采用VirtualBox虚拟机测试
CPU信息
操作系统及内核信息
系统默认开启了kdump,查看服务状态
查看内核命令行参数
对应/boot/grub2/grub.cfg
vmcore生成路径配置/etc/kdump.conf
测试触发内核崩溃
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
效果
vmlinux
方案一:extract-vmlinux
说明:软件包kernel-devel,提供了/usr/src/kernels/5.10.0-60.18.0.50.oe2203.x86_64/scripts/extract-vmlinux,该脚本在x86_64平台下可以从/boot/vmlinuz-5.10.0-60.18.0.50.oe2203.x86_64解压出vmlinux
解压出vmlinux
注意:在x86_64平台下,vmlinux是一个elf格式文件
方案二:源码编译出vmlinux
软件包kernel-source提供了当前版本内核源码,安装后源码路径
/usr/src/linux-5.10.0-60.18.0.50.oe2203.x86_64
安装编译依赖
yum install -y kernel-source gcc make elfutils-libelf-devel dwarves flex bison openssl-devel
配置、编译
cd /usr/src/linux-5.10.0-60.18.0.50.oe2203.x86_64
cp /boot/config-5.10.0-60.18.0.50.oe2203.x86_64 .config
make oldconfig
make -j6
编译出的vmlinux
内核崩溃分析
dmesg信息
cat /var/crash/127.0.0.1-2022-12-20-09\:05\:41/vmcore-dmesg.txt
vmcore信息
crash分析
安装crash
yum install crash
extract-vmlinux版(失败)
报错退出
源码编译版(报错)
报错退出
源码编译版(--minimal 成功)
注意提示
NOTE: minimal mode commands: log, dis, rd, sym, eval, set, extend and exit
log 查看dmesg
miminal有价值功能太少
安装编译的内核
cd /usr/src/linux-5.10.0-60.18.0.50.oe2203.x86_64
make modules -j6
make modules_install
make install
重启
reboot
默认用新安装的内核启动
重新触发内核崩溃
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
采用编译内核做crash分析
正常打印出崩溃时内核信息
bt查看调用堆栈
bt -slf 显示函数偏移量,方便对应源码
查看ffffffffa81e38b1地址前的反汇编 dis -r ffffffffa81e38b1
查看ffffffffa81e38b1地址后的反汇编 dis -f ffffffffa81e38b1
bt -c cpuid查看制定cpu调用堆栈,如bt -c 0
bt -a 显示所有cpu调用堆栈
rd读取内存值
查看cpu0进程
查看内核进程
其他参考