linux 内核态调试函数BUG_ON()[转]

一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。

当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。为什么这些声明会导致 oops跟硬件的体系结构

是相关的。大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops。你可以把这些调用当作断言使用,想要断言某种情况不该发生:

if (bad_thing)
BUG(); //需要linux 内核开启General setup->Configure standard kernel features->BUG() support

或者使用更好的形式:

BUG_ON(bad_thing);

可以用panic()引发更严重的错误。调用panic()不但会打印错误消息(Oops)而且还会挂起整个系统。显然,你只应该在极端恶劣的情况下使用它:

if (terrible_thing)
       panic("foo is %ld\n", foo);

有些时候,你只是需要在终端上打印一下栈的回溯信息来帮助你测试。此时可以使用dump_stack()。它只在终端上打印寄存器上下文和函数的跟踪线索:

if (!debug_check) {
       printk(KERN_DEBUG "provide some information...\n");
       dump_stack();
}

时间: 2024-10-19 07:24:08

linux 内核态调试函数BUG_ON()[转]的相关文章

Linux内核态抢占机制分析

http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢占条件):抢占发生的时机(何时检

Linux内核态抢占机制分析(转)

Linux内核态抢占机制分析  http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢

linux内核系统调用--sendfile函数

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: Java代码 read(file, tmp_buf, len); write(socket, tmp_buf, len); 以上两行代码是传统的read/wr

Linux内核中kzalloc函数详解

***************************************************************************************************************************作者:EasyWave                                                                                 时间:2013.02.06 类别:Linux 内核驱动源码分析    

【转】linux内核态和用户态的区别

原文网址:http://www.mike.org.cn/articles/linux-kernel-mode-and-user-mode-distinction/ 内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3四种级别的运行模式.Ring0级别最高,Ring3最低. 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中执行.当进程处于内核态时,执行的内核代码会使用当前

【转】 Linux 内核态与用户态

 内核态与用户态是操作系统的两种运行级别,一个运行在内核模式的进程可以执行指令集中的任何指令,并且可以访问系统中任何存储器位置.用户模式中的进程不允许执行特权指令,比如停止处理器.改变模式位,或者发起一个I/O操作.也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据. intel cpu提供Ring0-Ring3三种级别的运行模式.Ring0级别最高,Ring3最低.其中特权级0(Ring0)是留给操作系统代码,设备驱动程 序代码使用的,它们工作于系统核心态:而特权极3(Ring3)

linux内核cdev_init系列函数(字符设备的注册)

内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义: linux-2.6.22/include/linux/cdev.h struct cdev {    struct kobject kobj;          // 每个 cdev 都是一个 kobject    struct module *owner;       // 指向实现驱动的模块    const struct file_operations *ops;   // 操纵这个字符设备文件的方法    struct

【转】Linux内核的ioctl函数学习

来源:Linux公社  http://www.linuxidc.com/Linux/2007-12/9623.htm 我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围.为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. 一. 什么是ioctl. ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率

使用linux 版vscode 查看linux内核源码函数跳转比较慢的问题

在使用 deepin  +  vscode 查看linux源码时,发现比较恶心的问题,跳转到指定函数特别慢,偶尔还跳转不过去,在vscode 中安装一个插件就好了 1. vscode 安装插件名:C/C++ GNU Global 2. 在deepin中安装一个软件:sudo apt install global 3. 在deepin终端中使用 which global 查看global的安装路径  /usr/bin/global 4. 将这个路径配置到vscode 中 "gnuGlobal.gl