Chinaunix首页 | 论坛 | 博客
  • 博客访问: 733307
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: LINUX

2012-08-13 15:09:46

BUG_ON && WARN_ON

一.BUG_ON

LinuxBUG_ONWARN_ON用于调试,比如

#define (condition) do { /          if (((condition)!=0)) /                  (); / } while(0)

如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容

具体的BUG_ON最终调用__bug

__bug

{

*int*)0=0;

}

从而地址非法访问,

 

例如在你的驱动中调用BUG_ON(1),dmesg会出现下面类似信息

 

[   19.360000] Unable to handle kernel NULL pointer dereference at virtual address 00000000

[   19.360000] pgd = c0004000

[   19.360000] [00000000] *pgd=00000000

 

[   19.360000] Internal error: Oops: 817 [#1] PREEMPT

[   19.360000] Modules linked in。。。。

[   19.360000] CPU: 0    Tainted: P            (2.6.31 #201)

[   19.360000] pc : []    lr : []    psr: 40000013

[   19.360000] sp : c705ff50  ip : c705ff50  fp : c705ffc4

[   19.360000] r10: 00000000  r9 : 00000000  r8 : 00000000

[   19.360000] r7 : bf04c0b0  r6 : c705e000  r5 : c7908c80  r4 : 00000000

[   19.360000] r3 : 00000000  r2 : c705ff40  r1 : c705ff84  r0 : 00000000

[   19.360000] Flags: nZcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel

[   19.360000] Control: 0005317f  Table: 87150000  DAC: 00000017

[   19.360000] Process ts_thread (pid: 230, stack limit = 0xc705e270)

[   19.360000] Stack: (0xc705ff50 to 0xc7060000)

[   19.360000] ff40:                                     c0056590 c00560e8 00000000 c003466c

[   19.360000] ff60: c781c01c c7908c80 c705ff8c c705ff78 c00565dc c005656c 00000000 c7030480

[   19.360000] ff80: c705ffc4 00000000 c7908c80 c0051238 c705ff90 c705ff90 c705ffc4 c705ffcc

[   19.360000] ffa0: c7053dc0 00000000 bf04c0b0 00000000 00000000 00000000 c705fff4 c705ffc8

[   19.360000] ffc0: c0050fc4 bf04c0c0 00000000 00000000 c705ffd0 c705ffd0 00000000 00000000

[   19.360000] ffe0: 00000000 00000000 00000000 c705fff8 c003e0d8 c0050f4c 80376031 80376431

[   19.360000] Backtrace:

[   19.360000] Function entered at [] from []

[   19.360000] Function entered at [] from []

[   19.360000]  r7:00000000 r6:00000000 r5:00000000 r4:00000000

[   19.360000] Code: 0a000001 eb4031aa eaffffc0 e3a03000 (e5833000)

[   19.360000] ---[ end trace 3b848f3e016c12c9 ]---

 

函数的调用流程为,

代码流程,

fault.c

__do_kernel_fault--------[   19.360000] Unable to handle kernel NULL pointer dereference at virtual address 00000000

 

traps.c

die--->__die--->__show_regs   /   dump_mem

die -----[   19.360000] Internal error: Oops: 817 [#1] PREEMPT(支持抢占)

 

二.WARN_ON

WARN_ON则是调用dump_stack,打印堆栈信息,不会OOPS

 #define (condition) do { /

          if (((condition)!=0)) { /

                  ("Badness in %s at %s:%d/n", , __FILE__, __LINE__); /

                  (); /

          } /

  } while (0)

 

具体的调用情况与中断有关,可以通过linux中断机制来学习。

 

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

kangear2012-11-28 17:20:56

学习了。。。。