您的位置:首页 > 运维架构 > Linux

centos linux上面升级内核 进行内核调试的方法

2013-08-31 22:21 225 查看
     最近有些荒废了,心里上有些波动,内心远远不够强大,才导致失眠等等问题。希望自己的心智可以尽快尽快的成熟,像分析程序一样能够分析应对现实中的问题,做到心中有数。

     好久没有更新博客了。回来继续写。

     记录一下自己再centos上面进行内核调试的方法。通常我们在linux上面进行内核编程时,非常常见的一类错误就是内核panic。系统奔溃时调用crash_kexec函数处理所有事情。 看crash_kexec函数就可以明白系统奔溃时发生的事情。内核panic又分为两种,一种程度较轻,在这种情况下,系统依然可以运行,但是会打印出panic的错误,堆栈等等信息。在这种情况下,我们可以用dmesg看到我们程序中用printk打印出的内容,我们依然可以利用打印的方法来调试错误。另一种程度较严重,这种情况包括了内核空指针,死锁等情况,在这种情况下,系统会打印出panic的错误信息,然后系统就死在那里,没有了反应,在这种情况下,
就看不到在系统奔溃前我们在程序中用Printk打印出的调试信息了,因此这时调试就比较麻烦。

     为此,我们要利用kdump。kdump可以把操作系统奔溃时内存中的数据转存到一个文件,我们打开这个文件,就可以看到系统奔溃时的线程堆栈信息,dmesg信息等等很多有用的信息。kdump的相关介绍可以看这里:http://www.ibm.com/developerworks/cn/linux/l-cn-kdump4。为了实现kdump的使用,我们主要需要进行下面几个步骤:
1.  升级系统的内核,使用自己的用源码编译的内核(这个其实不是必须的,但是相对要方便)2.  安装kdump,安装kdump的方法是: http://blog.chinaunix.net/uid-26557245-id-3199660.html

yum install kexec-tools

#  chkconfig kdump on
#  service kdump start

kernel-debuginfo
不需要安装,因为我们用的是自己编译的内核,不是系统自带的内核,所以不需要从网上下载kernel-debuginfo。这部分文件下载得特别慢,很耗时间。

。 3. 重启系统,尝试使用kdump。 下面分别介绍。

     首先,我在虚拟机上安装了centos6.4,该系统自带的内核就是2.6.32版本的(用cat /etc/redhat-release可以看到centos的版本信息,这个是用uname -r 看不到的,uname只能显示内核的版本)。之前为了能够在系统上使用kdump,刚开始不了解原理,按照其他博客中的方法下载了kernel-debuginfo,这个文件特别的大,下载得很慢。而且具体在调试时候,其实主要是用到了/usr/lib/debug/`uname-r`/目录下载vmlinux文件。但是为了方便,因为在编写模块时候,有时还想在kernel的其他地方加些打印语句等,所以我还是想使用自己的内核,因此下载了linux2.6.32.26的内核。然后将/boot/.config
文件拷贝到 源码路径下面,然后make menuconfig,这里因为我们使用的内核版本和系统是非常接近的,所以拷贝了系统自带的config设置,几乎不需要进行其他改动,我主要是修改了与内核锁相关的config设置,打开了内核检测死锁等相关的选项,开启了这些选项是非常有效的,系统运行起来之后,就可以打印出可能引起死锁的位置,方便我们进行修改。然后make; make modules_install;
make install 就可以安装新的内核了。 升级centos内核的方法可以参考这个博文:http://300second.blog.51cto.com/7582/816758

其实这个博文中主要是提到了一点 就是make 时需要 用这个指令:
make CONFIG_DEBUG_SECTION_MISMATCH=y 。 如果不带后面这个参数的话, 我们在编译时,系统也会给出相应的提示。centos比fedora真心靠谱多了,决定以后不用fedora了,fedora真心耗了我很多时间,出各种各样的问题。现在的情况是,我带了这个参数编译好的内核启动时,系统会启动的比较慢,并且给出这个提示:


看来是make 带着的编译开关影响到了udev。这个会导致系统启动是变慢,暂时没有看到有明显的其他影响。至于这个博文中提到的修改init.img文件,我并没有修改,系统也是可以正常工作的。

 

系统启动后,我们就可以使用自己的内核了。为了配合Kudmp和crash的使用,因为crash在加载内核的core文件时,需要一个相同版本的vmlinux文件,因此我们需要生成自己的vmlinux文件。在内核源码路径下在执行make vmlinux,就可以生成想要的vmlinux文件。vmlinux是没有经过压缩的内核的可执行文件,而计算机启动时 加载的/boot/路径下的 vmlinuz-2.6.32文件是压缩了的内核的可执行文件。这就是两者的区别。

另外,现在我们查看/boot/grub/grub.conf文件,可以看到多了一行:


其中,2.6.32.26这个项就是新编译内核之后生成的。其中crashkernel=128M是kdump的相关设置。

 

到现在,我们的准备工作就都结束了。 执行sysRq指令,同时按下alt+sysrq+c按键,就产生了一个中断信号,这是就可以先看到系统显示打印出了panic的信息,然后很快pani信息不见了,kdump开始起作用了,显示如下:



很快系统就重启了。重启之后,我们在路径/var/crash下面可以看到kdump新生成的文件:通常是一个用时间命名的文件夹,在文件夹中有core文件。用crash进行加载: #crash /var/crash/127.0.0.1-2013-08-31/vmcore  /root/vmlinux 。这样进入 crash之后,我们用log指令就可以看到系统crash之前 printk打印的消息了,在结合mod -s /root/newmodules/newmodules.ko
加载自己的module,然后用dis -l  代码地址,就可以看到 奔溃时相应的代码是在哪个文件的哪一行了。这样就可以很准确的定位问题所在了。

这样非常的方便。这个是我目前进行内核调试的方法。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kdump linux kernel