linux内核调试之Kdump(CentOS6.3 + 2.6.39-200.24.1.el6uek.x86_64)

linux内核调试之Kdump(CentOS6.3 + 2.6.39-200.24.1.el6uek.x86_64)  

分类: LINUX

2013-04-10 11:08:10

原文地址:linux内核调试之Kdump(CentOS6.3 + 2.6.39-200.24.1.el6uek.x86_64) 作者:liuwenbo1123

 

     最近在做zerocopy网卡驱动,调试内核是个麻烦事情,大致的从网上找到了一些方法。1、printk  2、kdump  3、kgdb。
由于第三个方法需要两台机器,搭建环境比较麻烦,所以这里我主要是选择了前两个方法进行调试。学习之初就和论坛的内核版主瀚海书香大牛聊过,他说大部分问题都可以使用printk解决,从我这边来看确实是这样的。
由于有一些panic需要定位到比较细致的地方,因此使用kdump来定位。(插一句,panic的时候机器是死机的,这个时候还可以使用串口输出的办法,这里就不说了,瀚海书香的博客里面写明了怎么使用)

一、安装对应软件包
RHEL环境下kdump是默认安装的,实现kdump机制的几个重要的package如下:

kdump,kexec-tools ,kernel-debuginfo 
可以使用 rpm -qa | grep kdump,  rpm -qa | grep kexec, rpm -qa | grep debuginfo分别查询是否安装了对应的包。
我的系统是CentOS6.3,发现前两个包都安装了,只需要下载debuginfo对应的包即可。
这里下载了两个包,
kernel-uek-debuginfo-common-2.6.39-200.24.1.el6uek.x86_64.rpm
kernel-uek-debuginfo-2.6.39-200.24.1.el6uek.x86_64.rpm, 下载地址是  https://oss.oracle.com/ol6/debuginfo/

二、启动kdunp
1、修改grub.conf,在对应的启动内核参数上加上crashkernel=128M,注意在CentOS6.3上必须是crashkernel=128M,而不是传说中的crashkernel=128M@16M,否则重启后还是启动不了kdump

2、设置kdump服务开机是自动启动  chkconfig kdump on 

3、重启机器,可以尝试着service kdump restart

三、测试

通过sysrq强制系统崩溃

echo "c" > /proc/sysrq-trigger

这样系统会奔溃并且重启,重启后会发现/var/crash 下面会有个带有时间的目录,目录下面就是生成的vmcore文件。由于我们安装了debuginfo,会生成这个目录
/usr/lib/debug/lib/modules/2.6.39-200.24.1.el6uek.x86_64/,我们可以这样来调试vmcore文件,这类会把详细的栈信息打印出来

#crash /usr/lib/debug/lib/modules/2.6.39-200.24.1.el6uek.x86_64/vmlinux vmcore

四、调试自己的内核驱动
加载自己的内核驱动,然后启动,等待内核panic并且死机,重启后找到vmcore

 

 

#cd /var/crash/127.0.0.1-2013-04-07-10:26:12/             #进入目录                
#crash /usr/lib/debug/lib/modules/2.6.39-200.24.1.el6uek.x86_64/vmlinux vmcore     #开始调试


#mod -S /root/lwbtest/bnx2-uek-39/bnx2     #连接symbo,也就是你的代码目录
#log            #把log显示出来,一直按着空格键到最后,就会出现最后crash的地方,会有一句如下所示的话
       RIP  [] bnx2_alloc_rx_skb+0xb2/0x190 [bnx2]       (注意这个 bnx2_alloc_rx_skb+0xb2,后面的指令需要用到)
#l* bnx2_alloc_rx_skb+0xb2
0xffffffffa0459242 is in bnx2_alloc_rx_skb(/root/bnx2-uek-39/bnx2/bnx2.c:3153)这里就会提醒是3153行出问题了,同时下面会显示10行代码。

自己查看对应的代码解决问题就ok 



如何使用crash工具分析Linux内核崩溃转储文件

[日期:2012-12-22] 来源:Linux社区  作者:Linux [字体:  ]
 

本文首先介绍了 crash 的基本概念和安装方法,其次详细介绍了如何使用 crash 工具分析内核崩溃转储文件,包括各种常用调试命令的使用方法,最后以几个实际工作中遇到的真实案例向读者展示了 crash 的强大功能。在这篇文章中,既有详细的工具使用方法,又有丰富的实际案例分析,相信您读过以后定会受益匪浅。

什么是 crash

如前文所述,当 linux 系统内核发生崩溃的时候,可以通过 kdump 等方式收集内核崩溃之前的内存,生成一个转储文件 vmcore。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因,从而进行操作系统的代码改进。那么 crash 就是一个被广泛使用的内核崩溃转储文件分析工具,掌握 crash 的使用技巧,对于定位问题有着十分重要的作用。

使用 crash 的先决条件

由于 crash 用于调试内核崩溃的转储文件,因此使用 crash 需要依赖如下条件:

1. kernel 映像文件 vmlinux 在编译的时候必须指定了 -g 参数,即带有调试信息。

2. 需要有一个内存崩溃转储文件(例如 vmcore),或者可以通过 /dev/mem 或 /dev/crash 访问的实时系统内存。如果 crash 命令行没有指定转储文件,则 crash 默认使用实时系统内存,这时需要 root 权限。

3. crash 支持的平台处理器包括:x86, x86_64, ia64, ppc64, arm, s390, s390x ( 也有部分 crash 版本支持 Alpha 和 32-bit PowerPC,但是对于这两种平台的支持不保证长期维护 )。

4. crash 支持 2.2.5-15(含)以后的 Linux 内核版本。随着 Linux 内核的更新,crash 也在不断升级以适应新的内核。

crash 安装指南

要想使用 crash 调试内核转储文件,需要安装 crash 工具和内核调试信息包。不同的发行版安装包名称略有差异,这里仅列出 RHEL 和 SLES 发行版对应的安装包名称如下:

表 1. crash 工具和内核调试包

系统版本 crash 工具名称 内核调试信息包
RHEL6.2 crash kernel-debuginfo-common
kernel-debuginfo
SLES11SP2 crash kernel-default-debuginfo
kernel-ppc64-debuginfo

以 RHEL 为例,安装 crash 及内核调试信息包的步骤如下:

 rpm -ivh crash-5.1.8-1.el6.ppc64.rpm 
 rpm -ivh kernel-debuginfo-common-ppc64-2.6.32-220.el6.ppc64.rpm 
 rpm -ivh kernel-debuginfo-2.6.32-220.el6.ppc64.rpm 
启动 crash

启动参数说明

使用 crash 调试转储文件,需要在命令行输入两个参数:debug kernel 和 dump file,其中 dump file 是内核转储文件的名称,debug kernel 是由内核调试信息包安装的,不同的发行版名称略有不同,以 RHEL 和 SLES 为例:

 RHEL6.2:/usr/lib/debug/lib/modules/2.6.32-220.el6.ppc64/vmlinux 
 SLES11SP2:/usr/lib/debug/boot/vmlinux-3.0.13-0.27-ppc64.debug 
使用 crash -h 或 man crash 可以查看 crash 支持的一系列选项,这里仅以常用的选项为例说明如下:

-h:打印帮助信息

-d:设置调试级别

-S:使用 /boot/System.map 作为默认的映射文件

-s:不显示版本、初始调试信息等,直接进入命令行

-i file:启动之后自动运行 file 中的命令,再接受用户输入

上一篇:MySQL下载和安装教程


下一篇:javascript中Math ceil(),floor(),round()三个函数的对比