首页 > 代码库 > crash 调试kernel

crash 调试kernel

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