BUG() 和 BUG_ON()
BUG()
BUG()
是一个无条件触发内核错误的宏:
BUG(); // 无条件触发内核错误
当执行到 BUG()
时,内核会:
- 触发一个非法指令异常
- 生成内核 oops 信息
- 可能导致内核 panic(取决于配置)
BUG_ON(condition)
BUG_ON()
是一个条件判断宏:
BUG_ON(condition); // 如果条件为真,触发内核错误
等价于:
if (condition)BUG();
使用场景示例
// 检查指针是否为空
void my_function(struct device *dev)
{BUG_ON(dev == NULL); // 如果dev为空,触发BUG// 正常的处理逻辑dev->ops->start(dev);
}// 检查不可能发生的情况
int calculate_offset(int size)
{BUG_ON(size < 0); // 大小不应该为负数return size * 2;
}
与 panic() 的区别
宏 | 行为 | 使用场景 |
---|---|---|
BUG()/BUG_ON() | 触发 oops,可能继续运行 | 代码逻辑错误,不应该发生的情况 |
panic() | 立即停止系统 | 系统无法继续运行的严重错误 |
实际效果
当触发 BUG 时,你会看到类似输出:
kernel BUG at drivers/xxx/yyy.c:123!
Oops: 0000 [#1] SMP
CPU: 0 PID: 1234 Comm: process_name Tainted: G
... (堆栈跟踪信息)
开发建议
- 用于调试:主要用于开发阶段发现逻辑错误
- 不要滥用:生产环境中应尽量避免触发