完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE

news/2025/11/26 22:34:30/文章来源:https://www.cnblogs.com/tlnshuju/p/19274835

完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE

2025-11-26 22:27  tlnshuju  阅读(0)  评论(0)    收藏  举报

一、背景

内核代码里频繁能看到一些用于检查一些条件的宏,如BUG_ON,WARN_ON等,这些宏除了直观的说明条件应该或者不应该被满足以外,还能方便我们进行规范的打印,让代码更加简洁,也同时满足的一些基本的要求,如在内核代码里进行打印时不建议直接使用printk,需要启用dev_printk或者至少得用pr_xx这样的打印宏。你若使用printk来进行打印输出的时候,如果用./scripts/checkpatch.pl来扫描你的改动的patch的话,假设发现是直接使用printk的话,checkpatch.pl的检查脚本会报出一个警告的。

这篇博客里,大家一次介绍一下这些基本的宏。

二、BUG/BUG_ON宏

我们搜索BUG_ON宏可能搜到,它是分为可以是ARCH代码来实现,也可以不用ARCH代码用公共的代码来实现:

通过如上图能够看到BUG_ON就是判断入参的条件,要是入参的条件是true,就调用BUG宏来触发panic。

CONFIG_BUG默认情况下就是打开的:

在没有定义arch的BUG_ON函数时,就用公共代码的BUG_ON构建。

许可看到是有有些arch下构建自己的BUG_ON的,搜索HAVE_ARCH_BUG_ON就可以搜到:

如mips平台的BUG_ON实现:

三、WARN_ON,WARN_ON_ONCE,WARN_ONCE宏

3.1 WARN_ON的实现

被包在一般都开的CONFIG_BUG宏里的:就是WARN_ON的下面的定义也

用的上图里的定义。就是常见的arm64平台和x86平台也都

大家进一步看__WARN宏的实现,__WARN宏根据有没有定义__WARN_FLAGS的情况,

来进行的定义:

而__WARN_FLAGS在x86和arm64平台都有相关定义:

我们追一下arm64平台的也就是上图里的__BUG_FLAGS是如何实现的,如上图看到__BUG_FLAGS使用了ASM_BUG_FLAGS,ASM_BUG_FLAGS定义如下:

BUG_BRK_IMM,定义及如下:就是可以看到上面图里红色框出的部分,也就是用了brk汇编指令,传入的

3.2 WARN_ON_ONCE和WARN_ONCE的区别

WARN_ON_ONCE和WARN_ONCE在内核代码里大量利用,它们俩是有区别的,哪怕区别并不复杂,但是却很有用,且容易被忽视。

WARN_ON_ONCE的定义如下:

它是无法输入自定义的字符串的。

而WARN_ONCE则不同,可以输入自定义的字符串:

这个区别很关键,有时候就必须定义自己的日志内容。

3.3 WARN_ONCE如何确保只打印一次

如何实现的:就是接着上面分析的WARN_ONCE宏来看一下WARN_ONCE宏所调用的DO_ONCE_LITE_IF宏

如上图行看到DO_ONCE_LITE_IF宏利用了__ONCE_LITE_IF宏来判断是否已经打印了一次。

而__ONCE_LITE_IF宏声明了一个static的bool类型的变量,这样就可以保留之前是否已经打印一次的状态了。

3.4 如何清楚打印了一次的标记

__section(".data.once")的段,这个为什么要用这个段呢,源于这个段可以让环境针对这些WARN_ONCE的标记的变量统一进行一些批处理。就是可以从上面 3.3 的分析里可以看到,在声明用于判断是否打印一次的变量时,用得

对该.data.once段的所有标记位进行清除:就是下图里的clear_warn_once_set函数就

而clear_warn_once_set被集成进clear_warn_once_fops后,

最后暴露出debugfs的用户态可以进行控制的节点:

通过有关的能够清楚WARN_ONCE标记的命令如下:

echo 1 > /sys/kernel/debug/clear_warn_once

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/977726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心专题笔记(从b站左程云老师那上完后的笔记)

https://www.bilibili.com/video/BV1ST4y1s7XT/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=56781f0f92104550238c449cb1aebd72 关键:用对数器验证 1.如果要排序,保证排序具有…

Agent编写全攻略(超详细)从零基础到精通,一篇搞定,不看后悔,赶紧收藏!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做题警醒

1.一定要写边界条件,不要偷懒不要偷懒!!! 经典案例题目https://www.luogu.com.cn/problem/P3763 这里一开始没把根节点单独考虑,直接将st1的赋值为0,st2的也复制为0 2.链式向前星建完图遍历是注意head[]写的是节点不…

动态规划可能性展开

1.以结尾展开可能性 从0……i中,判断i,然后调用0……i-1的可能性(可以是以i这个下标为结尾,也可以是0……i的范围上,也可以是以i下标所放的值进行展开) 2.定义往往从递归的定义出发,但是为了避免讨论边界的麻烦…

微软发布 Godot C# 游戏开发教程:godot-csharp-essentials

对于希望踏入游戏开发领域的 C# 开发者来说,一个令人振奋的好消息是:微软在其 GitHub 上发布了一个全新的开源项目microsoft/godot-csharp-essentials:https://github.com/microsoft/godot-csharp-essentials。这个仓…

Day3-20251126

本文介绍了Java开发相关的JDK、JRE和JVM概念,并详细说明了JDK的卸载和安装步骤。卸载时需删除安装目录和环境变量配置,安装时要注意下载对应版本并正确配置环境变量。最后通过cmd验证安装是否成功,并推荐使用notepa…

[KaibaMath]1028 关于[log(m, a)]+1=⌈log(m+1, a)⌉的证明

下面给出[log(m,a)]+1=⌈log(m+1,a)⌉的证明,证明过程非常丝滑。特别地,令a=2,则有1025的结论。

QT TCP服务器构建及网络通信实现 - 详解

QT TCP服务器构建及网络通信实现 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

SCTimer/PWM定时器(续二)

前面讨论了SCT的全部寄存器结构及其功能,现在就具体来看一下LPC824中这个充满特色的SCTimer/PWM,首先看一下它的简介。 状态可配置定时器(SCTimer/PWM) 是恩智浦半导体特有的一种外设,它不仅可像大多数传统定时器一…

软件工程学习日志2025.11.26

项目概览目标:生成纯中文儿童故事,风格干净,无英文与“思考/分析”类文字;自动生成卡通图片并支持语音朗读。 技术栈:Spring Boot(后端)、原生 JS + 静态 HTML(前端)、SiliconFlow API(文本与图片)、浏览器…

[KaibaMath]1027 关于mn ⇔ m≥n+1(m,n均为整数)的证明

若m和n均为整数,则m>n ⇔ m≥n+1. 下面给出相应的证明。

自指自洽即因果,可知可行,很烦很好

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891对命题"自指自洽即因果,可知可行,很烦很好"进行严格的加密推理分析。 ▮ 辩证本质:认知实践的完整循环 命题揭示了意识系统的完整运作机制 - 自…

干扰素信号通路:从JAK-STAT到科研应用

在生命科学领域,干扰素的强大功能——从抗病毒到免疫调节——最终都通过其细胞内精确的信号转导来实现。其中,JAK-STAT通路是传递干扰素信号的核心桥梁。对于致力于免疫学、病毒学及信号转导研究的科研人员而言,深入…

2025年11月室外木塑地板厂家,共挤木塑地板厂家,wpc木塑地板厂家品牌推荐:市政工程合作优选企业

2025年11月室外木塑地板厂家品牌推荐:市政工程合作优选企业在2025年11月,如果您正在寻找优质的室外木塑地板厂家、共挤木塑地板厂家或者wpc木塑地板厂家,临沂军森木塑有限公司绝对值得您的关注,是市政工程合作的优…

2025年11月二代木塑地板厂家,防水木塑地板厂家,环保木塑地板厂家推荐:无醛环保认证品牌盘点

2025年11月二代木塑地板厂家推荐:无醛环保认证品牌盘点 在环保意识日益增强的今天,木塑地板凭借其环保、耐用等诸多优点,越来越受到消费者的青睐。如果你正在寻找一家靠谱的防水、环保木塑地板厂家,那么临沂军森木…

ABC396 VP总结

比赛链接 ResultCloudflare 发力了!!! D题人机验证一直在卡,然后又就丢掉写 E 去了,于是忘记还有道题没交,然后 \(ans\) 初始值设小了;F 题提交的时候人机验证卡了 10min,不然应该能调出来…… Solution D - M…

11月26日日记

1.今天上了一整天马哲 2.明天体育课 3.如何通过 Nginx 配置保留 Session 一致性?分布式场景下 Session 共享方案有哪些?

Zelda

Z is not important, but Link loves her. but actually Nihon are not like this. Nihon samurai liked to torment real princesses and kill them. Nihon like the honorable person, and rape, kill her. everyone…

3D scanning with structured light(使用结构光进行三维扫描)

3D scanning with structured light(使用结构光进行三维扫描)介绍结构光三维扫描。只需要一个廉价的投影仪和webcam(网络相机),就能打造一个属于自己的三维扫描仪,这便是结构光三维扫描仪,它利用结构光把不同光照模…