分类: 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 中的命令,再接受用户输入