BUG_ON()和WARN_ON()的用法

来源:互联网 发布:mac 应用程序图标 编辑:程序博客网 时间:2024/05/18 02:43
     一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。为什么这些声明会导致 oops跟硬件的体系结构是相关的。大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops。你可以把这些调用当作断言使用,想要断言某种情况不该发生 :
if (bad_thing)
BUG();
或者使用更好的形式:

BUG_ON(bad_thing);

BUG_ON && WARN_ON


Linux中BUG_ON,WARN_ON用于调试,比如

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

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

具体的BUG_ON最终调用__bug

__bug

{

*(int*)0=0;//在linux里面NULL就是定义在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 : [<bf04c1e4>]    lr : [<bf04c1c4>]    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 [<bf04c0b0>] from [<c0050fc4>]

[   19.360000] Function entered at [<c0050f3c>] from [<c003e0d8>]

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

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

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

 

二.WARN_ON

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

 #define WARN_ON(condition) do { /

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

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

         dump_stack(); /

         } /

  } while (0)

 

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如果老师喜欢自己怎么办 孩子不思进取逃避学习怎么办 老师拿孩子泄愤怎么办 老师对小孩不好怎么办 孩子被老师骂怎么办 孩子幼儿园被打怎么办 两个家长吵架老师怎么办 家长和老师矛盾怎么办 孩子特别害怕老师怎么办? 老师排挤孤立孩子怎么办 很害怕一件事怎么办 高中老师误会我怎么办 家长讹老师老师怎么办 小孩子老说头疼怎么办 孩子总是否定自己怎么办 孩子总是否定别人怎么办 老师屏蔽家长该怎么办 初二学生学疲劳怎么办 孩子不愿补英语怎么办 培训班孩子不学怎么办 小孩不想去学校怎么办 讨厌父母的性格怎么办 老师揪孩子耳朵怎么办 老师整天骂孩子怎么办 教师被学生骂怎么办 幼儿园学生骂老师怎么办 学生骂老师外号怎么办 小孩上课很多嘴怎么办 学生老玩手机怎么办 和校长有了矛盾怎么办 家长打了我怎么办 小朋友不想去幼儿园怎么办 小朋友不想上幼儿园怎么办 高中老师打学生家长怎么办 老师偏心学生该怎么办? 老师能打孩子怎么办 有的幼儿打老师怎么办? 孩子特别怕老师怎么办 孩子跟老师认生怎么办 和搭班老师不合怎么办 学生厌学了老师怎么办