Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39341
  • 博文数量: 25
  • 博客积分: 605
  • 博客等级: 中士
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 21:57
文章分类

全部博文(25)

文章存档

2012年(22)

2011年(3)

我的朋友

分类: LINUX

2012-05-01 11:14:05

参考文档

kernel document里oops-trace.txt

LDD 第四章

 

打印信息中会告诉你死在哪个函数

然后去查找pc 寄存器指针位置(即下面的EIP)

Unable to handle kernel NULL pointer dereference at virtual address 00000000
printing eip:
d083a064
Oops: 0002 [#1]
SMP
CPU: 0
EIP: 0060:[] Not tainted
EFLAGS: 00010246 (2.6.6)
EIP is at faulty_write+0x4/0x10 [faulty]
eax: 00000000 ebx: 00000000 ecx: 00000000 edx: 00000000
esi: cf8b2460 edi: cf8b2480 ebp: 00000005 esp: c31c5f74
ds: 007b es: 007b ss: 0068
Process bash (pid: 2086, threadinfo=c31c4000 task=cfa0a6c0)
Stack: c0150558 cf8b2460 080e9408 00000005 cf8b2480 00000000 cf8b2460 cf8b2460
fffffff7 080e9408 c31c4000 c0150682 cf8b2460 080e9408 00000005 cf8b2480
00000000 00000001 00000005 c0103f8f 00000001 080e9408 00000005 00000005
Call Trace:
[] vfs_write+0xb8/0x130
[] sys_write+0x42/0x70
[] syscall_call+0x7/0xb

注:示例是随便写的

 

首先arm-linux-objdump -d vmlinux > dump

查找指针所对应的指令

c0279f18:    ea000032     b    c0279fe8
c0279f1c:    e288700c     add    r7, r8, #12
c0279f20:    e1530007     cmp    r3, r7
c0279f24:    31a07003     movcc    r7, r3
c0279f28:    e1a0300d     mov    r3, sp
c0279f2c:    35900018     ldrcc    r0, [r0, #24]
c0279f30:    e3c36d7f     bic    r6, r3, #8128    ; 0x1fc0
c0279f34:    e3c6603f     bic    r6, r6, #63    ; 0x3f
c0279f38:    33800008     orrcc    r0, r0, #8
c0279f3c:    35840018     strcc    r0, [r4, #24]
c0279f40:    e58d200c     str    r2, [sp, #12]

 

然后去找出错函数的文件

arm-linux-objdump -S sysfs.o > dump2

查找具体出错的位置

static inline void list_del(struct list_head *entry)
{
    __list_del(entry->prev, entry->next);
    entry->next = LIST_POISON1;
  34:    e59f307c     ldr    r3, [pc, #124]    ; b8
  38:    e1530007     str    r3, [r4, #56]    ; 0x38
    entry->prev = LIST_POISON2;
  3c:    e59f3078     ldr    r3, [pc, #120]    ; bc
  40:    e584303c     str    r3, [r4, #60]    ; 0x3c
    unsigned long tmp;
    int result;

    smp_mb();

 

然后发现是一个指针问题

ktype的指针不对

但这个指针指向的是一个全局变量device_ktype

 

后来发现添加设备时 全局变量加了个__initdata  结果挂载系统是这个全局变量会被释放掉。

 

而出现这个问题是因为这段代码是我copy的, 看来还是要自己打字写代码,少copy。

阅读(359) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~