转载地址:https://blog.csdn.net/qiaoshouliang/article/details/8512381

一些内核调用可以用来方便标记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)

内核 BUG_ON 以及WARN_ON 用法作用相关推荐

  1. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  2. linux内核中的jiffies,Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

    在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构 struct timeval { time_t tv_s ...

  3. linux 内核打印函数 printk 用法

    printk在内核源码中用来记录日志信息的函数,只能在内核源码范围内使用.用法和printf非常相似 printk函数主要做两件事情:第一件就是将信息记录到log中,而第二件事就是调用控制台驱动来将信 ...

  4. linux 内核驱动 insmod mknod的作用

    今天写了一个linux的驱动,编译成功,用NFS在目录板上运行,insmod后,在/proc/devices里面能看到,用lsmod也能看到那个设备,但在/dev里找不到设备文件.应用测试程序open ...

  5. Java中toString的用法/作用

    今天在学习java中直接输出集合对象 list,得到的是一串字符,后来经提醒,需要在类中重写toString方法 toString源代码: public String toString() {retu ...

  6. jdbc 中 excute executeUpdate的用法作用

    感谢阅读:我们一帮刚毕业的同学维护了一个公众号,旨在分享一下学习或者面试上的坑.刚兴趣的同学可以关注一起学习. Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.e ...

  7. 宏EXPORT_SYMBOL在内核中的作用

    Module运行在kernel space,不能直接调用应用程序库,只能调用内核函数. EXPORT_SYMBOL的作用是把内核函数的符号导出,也就是将函数的入口地址导出. Module在运行的时候会 ...

  8. typedef的作用和用法(给结构体,函数指针,数组取别名)

    typedef的作用和用法 作用(typedef 能给int,double,float,char等数据类型取别名) typedef 还能给结构体取别名 typedef 还能给函数指针取别名 typed ...

  9. HTML中:after、:before、:hover的作用及其用法

    一.:before的作用和用法 作用:用于在元素内容前面加上指定内容 用法: <!DOCTYPE html> <html lang="en"> <he ...

  10. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

最新文章

  1. 动态矩阵控制 MATLAB代码
  2. ML之FE:利用FE特征工程(分析两两数值型特征之间的相关性)对AllstateClaimsSeverity(Kaggle2016竞赛)数据集实现索赔成本值的回归预测
  3. boost::python::long_相关的测试程序
  4. 如何编写nopCommerce插件
  5. bom .dom_MicroProfile 2.2 BOM导入支持
  6. 卡夫卡编年史队列基准
  7. 在Spark Scala/Java应用中调用Python脚本,会么?
  8. Java中SQL语句传向数据库
  9. tensorflow随机梯度下降算法使用滑动平均模型
  10. 【渝粤教育】广东开放大学 计算机组成原理 形成性考核 (21)
  11. access ea 可以联网吗_EA自家Origin平台高级会员Origin Access Premier现已上线
  12. CRM客户关系管理系统的设计与实现
  13. 米家扫地机器人静音模式在哪_米家扫地机器人2代发布日期确定:带拖地功能...
  14. QQ空间FLASH代码及其使用方法
  15. Java面试官推荐的开发面试要点
  16. 关于显卡的一些参数说明,告诉你如何分辨哪个好一点,哪个烂一点。
  17. 【机器学习】手写数字识别学习笔记(对三篇文件进行分析记录)
  18. 鲍尔默退休:Wintel帝国走向崩溃还是重构?
  19. 深入解析:如何修复SSL / TLS握手失败错误(上)
  20. html css实现文本水平垂直居中显示

热门文章

  1. 微分算子法解微分方程
  2. 数据分析师工作内容 数据分析的六个步骤
  3. 【飞控开发基础教程3】疯壳·开源编队无人机-串口(基础收发)
  4. Python 金融量化 道路突破策略(唐奇安道路突破策略布林带通道及其市场风险)
  5. SWAT 建模与案例应用
  6. 【错误解决】Ubuntu20.04安装输入法遇到的问题
  7. 矢量绘图工具 Ipe
  8. NoteBook / 期货及衍生品基础(3)
  9. java语音处理包判断音高,灵活使用GoldWave处理音频变声
  10. Qt实现 员工培训管理系统