centos kdump


介绍

通过kexec和kdump当内核crash的时候可以显示堆栈信息。方便调试。


安装

sudo yum install kexec-tools
sudo yum install kernel-debug kernel-debug-devel
yum install crash gdb


为了让内核都统一,不妨内核也升级一下
yum install kernel kernel-devel


添加内核启动参数

crashkernel=128M@16M
在/etc/grub.cfg中添加,表示启动的时候从16M的位置开始,预留128M内存用于crashkernel
注意centos6.2我发现可能已经默认支持了kdump,只是没有启动而已,grub.cfg中已经添加了crashkernel=auto


配置文件

/etc/kdump.conf
配置coredump的位置,默认是 /var/crash


测试

reboot后
这会创建/boot/initrd-kdump.img用于capture coredump,这非常重要,否则kdump就会启动失败。
该文件就是kdump加载的内核的 initrd文件,收集dump信息的工作就是在该initrd的启动环境下进行的。
查看/etc/init.d/kdump脚本的代码,你可看到其中会调用mkdumprd命令创建用于dump的initrd文件。


service kdump status


触发crash
echo 1 > /proc/sys/kernel/sysrq
echo “c” > /proc/sysrq-trigger


等待时间比较长,大概5分钟,系统又重新进入了桌面。


用crash 工具分析vmcore 文件


用crash 命令分析vmcore 的命令行格式如下所示.
用crash打开vmcore后,主要是用dmesg及 bt 命令打印出问题的执行路径的call trace,
用dis 反汇编出代码,最终确认call trace对应的C源码中的位置,再进行逻辑分析.



遗留问题

用crash需要vmlinux,到哪里获得?
可能需要安装kernel-debuginfo
但标准库里可能没有,需要另外添加。
http://www.dedoimedo.com/computers/centos-debug.html


http://wiki.centos.org/AdditionalResources/Repositories
已经说得很清楚了,需要额外添加debuginfo的库
不过看到centos6.2中自带了
/etc/yum.repos.d/CentOS-Debuginfo.repo
注意把其中的enabled改为1,然后就可以安装了
kernel-debuginfo 将近300M


先不下了,速度太慢了,10k。


还有个问题,就算能看vmcore了,那模块coredump也能看吗?


systemtap

有空再研究一下kprobe和systemtap
http://hi.baidu.com/donglix/item/13052275911e7a5f0c0a07f8