Heng30的博客
搜索 分类 关于 订阅

如何进行Linux驱动调试-BUG_ON?

2025-02-25

BUG_ON()是Linux内核中一个用于调试和错误处理的宏,用于在特定条件为真时触发内核异常(如panicoops),并打印调试信息(包括调用堆栈)。

功能与作用

  • 条件检查:当传入的条件为真(非零)时,触发内核异常。

  • 调试辅助:帮助开发者快速定位代码中的逻辑错误或非法状态。

  • 异常处理:触发异常后,内核会打印调用堆栈(通过dump_stack())并终止当前线程或系统。

例子

void my_function(int *ptr)
{
    BUG_ON(!ptr); // 如果 ptr 为 NULL,触发异常
    *ptr = 42;
}

输出

[30902.242390] kernel BUG at /home/blue/modules/hello/hello.c:10!
[30902.242408] invalid opcode: 0000 [#1] PREEMPT SMP PTI
[30902.242414] CPU: 1 PID: 10102 Comm: insmod Tainted: G        W  OE      6.8.0-52-generic #53-Ubuntu
[30902.242419] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[30902.242421] RIP: 0010:hello_init+0x15/0xff0 [hello]
[30902.242430] Code: Unable to access opcode bytes at 0xffffffffc0977ffb.
[30902.242433] RSP: 0018:ffffab91824c7870 EFLAGS: 00010246
...