linux驱动调试--使用crash分析linux dump文件

1、kdump介绍与设置

1)介绍:

Kdump 是一种基于 kexec 的内存转储工具,目前它已经被内核主线接收,成为了内核的一部分,它也由此获得了绝大多数 Linux 发行版的支持。与传统的内存转储机制不同不同,基于 Kdump 的系统工作的时候需要两个内核,一个称为系统内核,即系统正常工作时运行的内核;另外一个称为捕获内核,即正常内核崩溃时,用来进行内存转储的内核。

2)设置

应用程序->系统工具->kdump->启用kdump

查看/boot/grub/grub.conf文件中kernel一行最后是否有crashkernel=128M@16M,如果没有,添加上去,重启

3)测试kdump是否可用
执行 echo 1 > /proc/sys/kernel/sysrq
     echo c > /proc/sysrq-trigger

经过两次自动重启后,查看/var/crash/目录下是否有vmcore文件生成,如果有表示kdump可用

2、生成带调试信息的vmlinux文件
1)下载安装包

redhat:ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/i386/Debuginfo/

centos:    debuginfo.centos.org

2)按顺序安装 kernel-debuginfo-common-2.6.18-194.3.1.el5.i686.rpm和kernel-debuginfo-2.6.18-194.3.1.el5.i686.rpm,

之后会在/usr/lib/debug/lib/modules/2.6.18-194.3.1.el5/下生产vmlinux文件

3、进入vmlinux所在目录,执行crash /var/crash/2012-03-13-21\:05/vmcore vmlinux 
mod -S XXX  --导入XXX目录下所有符号
log         --查看日志文件,找到最后一条,如EIP: [<f8ee53f5>] bshtej_interrupt+0x103f/0x11cb [tej21] SS:ESP 0068:c0768f38
l* bshtej_interrupt+0x103f 出现如下内容
0xf8ee53f5 is in bshtej_interrupt (/opt/dahdi-linux-complete-2.2.1+2.2.1/linux/drivers/dahdi/tej21/tej21.c:2910).
2904            int c, x;
2905
2906
2907            for(c = 0; c < MAX_CARDS; c++)
2908            {
2909                    if (!cards[c]) break;
2910                    for (x=0;x<cards[c]->numspans;x++) {
2911                            if (cards[c]->tspans[x]->sync)
2912                            {
2913                  
 
到此可确定死机问题出现在2910行。

4、设置过滤等级:

vmcore文件一般会收集内核崩溃时的各种信息,所以生成时间会较长,文件比较大,如果不需要某些信息的话,可对kdump.conf文件进行配置

vim  /etc/kdump.conf

core_collector makedumpfile -c 这行打开,并加上-d 31,参数说明如下:

-c: Compress dump data by each page.

-c: Compress dump data by each page.

-d: Specify the type of unnecessary page for analysis.
Dump  |  zero   cache   cache    user    free
  Level |  page   page    private  data    page
  -------+---------------------------------------
      0  |
      1  |  X
      2  |         X
      4  |         X       X
      8  |                          X
    16  |                                  X
    31  |  X      X       X        X       X


5、根据Oops值大致判断错误:

Oops的错误代码根据错误的原因会有不同的定义如果发现自己遇到的Oops和下面无法对应的话,最好去内核代码里查找:

* error_code:

 *      bit 0 == 0 means no page found, 1 means protection fault
 *      bit 1 == 0 means read, 1 means write
 *      bit 2 == 0 means kernel, 1 means user-mode
 *      bit 3 == 0 means data, 1 means instruction


 

你可能感兴趣的:(c,redhat,cache,工具,each,Crash)