1. 什么是crash
crash是用来调试linux 的kdump生成的vcore,或者用来调试live system;
2. 调试前准备
调试中需要用到vmlinux,该vmlinux与生成vcore或者live system的vmlinuz必须一致,
这就意味着我们需要自己编译内核,生成initrd,更新grub.cfg;
3. 编译内核
下载源码,然后转到源码目录(或者新建一个目录,在该目录下运行make -C /usr/src/linux O=`pwd`);
将当前运行内核的config文件拷过来(位置在/boot 目录下,config*等文件),重命名为.config;
在编译内核之前,需要确认.config中,以下编译选项是否打开:
(1)CONFIG_DEBUG_INFO ,必须打开该选项,否则crash会出现以下错误:
crash no debugging data available
(2)CONFIG_STRICT_DEVMEM,必须打开该选项,否则crash会出现以下错误:
crash: read error: kernel virtual address: c0670680 type: "kernel_config_data"
WARNING: cannot read kernel_config_data
crash: read error: kernel virtual address: c066bb68 type: "cpu_possible_mask"
设置完毕,开始编译,依次运行如下命令:
(1) make bzImage
(2) make modules
(3) make modules_install
(4) make install (运行该命令后,会在/boot目录下生成我们自己的vmlinuz)
4. 生成initrd
转到/boot 目录下,运行update-initramfs -c -k [version] ,如我编译的内核为2.6.38.6,则生成的
vmlinuz为vmlinuz-2.6.38.6, 运行update-initramfs -c -k 2.6.38.6生成的为initrd.img-2.6.38.6;
5. 更新grub.cfg
首先备份下/boot/grub/grub.cfg,然后运行update-grub2命令即可;如有必要,可以调整下启动项之间的位置;有的系统可能直接启动内核,不给我们选择的机会,此时要修改/boot/grub/grub.cfg,将下面代码注释(不同的系统有所不同,总之就是要给我们选择的时间)
### BEGIN /etc/grub.d/30_os-prober ###
if [ ${timeout} != -1 ]; then
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
#### END /etc/grub.d/30_os-prober ###
6. 更新crash
在完成以上内容之后,重启系统,然后选择我们自己编译的内核,进入系统后,进入我们编译内核时的目录,该目录下有我们自己的vmlinux(未压缩的),然后运行如下命令就可以对当前内核进行调试:
crash vmlinux
如果出现错误:
crash: cannot resolve: "xtime"
则说明需要更新crash,可以去http://people.redhat.com/anderson下载最新的crash,自己进行编译(下载后,直接make即可运行);
我下的版本为crash 6.1.0,可以调试的最高内核版本为3.6(当前的最新版本);
参考:
http://people.redhat.com/anderson
原文地址:http://blog.csdn.net/gpstrive/article/details/29217755