
- dump_stack(调试)
- WARN_ON(驱动使用) --- 警告 ---- 定位谁调度
- BUG_ON(驱动使用) --- 严重缺陷 ----- 定位缺陷 ---- 可以进行判断
- panic(驱动使用)----- 没有判断条件
一、dump_stack(调试)
dump_stack 作用:打印内核调用堆栈,并打印函数的调用关系。 这里以最简单的 helloworld 驱动为例进行 dump_stack 函数演示,实验代码如下所示:
c
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/ptrace.h>
static int __init helloworld_init(void)
{
printk(KERN_EMERG "helloworld_init\r\n");
dump_stack();
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL v2");1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在第 7 行添加了 dump_stack(),驱动加载之后打印信息如下:

二、WARN_ON()
WARN_ON(条件) 的作用是:当括号里的条件成立时,内核会立即输出错误警告,并显示当前函数的调用路径(堆栈信息),但不会让系统崩溃。
简单来说:
- 如果条件成立(比如
WARN_ON(1)),就会触发警告 + 显示代码调用链,帮你定位问题来源。 - 这个警告表示"这里出现了不应该发生的情况",比如有人传入了错误参数。
- 它的作用就是通过调用路径告诉你:"问题出在调用这个函数的地方!"
例如:当你看到 WARN_ON(NULL) 的警告,说明某个地方传入了空指针,堆栈信息会直接指向出错的具体代码位置。
位置:net/wireless/rockchip_wlan/rtl8723ds/core/rtw_mem.c

三、BUG_ON()
崩溃
- 重启 ----- 商品化,尽快恢复。
- 不重启----- 等你来解决 bug。
则触发一个内核 BUG,导致系统崩溃。
Linux 内核中经常使用类似 BUG_ON() 的检查机制。它的作用就像程序中的紧急警报:当某个本不应该发生的条件出现时,内核会立即触发系统崩溃,同时打印错误信息和调用栈,帮助开发者定位问题。
具体来说:
- 触发条件:当传入的条件成立(比如
BUG_ON(1))时,会立即触发错误 - 工作原理:大部分系统架构通过执行无效指令(如除零操作或非法内存访问)强制产生系统崩溃(称为"oops")
- 设计目的:用于标记"绝对不可能发生"的场景,一旦触发说明代码存在严重逻辑错误
简单来说,它就像给程序设置了一个"如果出现这种情况立刻自毁并留下线索"的紧急开关。当程序运行到这里时,如果发现不该出现的条件真的出现了,就会强制系统崩溃并输出关键调试信息。
位置:sh/clk/core.c

四、painc
panic(fmt...) 函数:输出打印会造成系统死机并将函数的调用关系以及寄存器值就都打印了出来。
位置:
staging/imgtec/rogue/rk3368/rk_init_v2.c
