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

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

2025-02-25

dump_stack函数的基础上还有一个WARN_ON()函数。 WARN_ON() 是Linux内核中一个用于调试的宏,用于在特定条件为真时触发警告并打印警告信息,同时输出当前线程的调用堆栈(Call Stack)。

功能与作用

  • 条件检查:当传入的条件为真(非零)时,触发警告。

  • 警告信息:打印警告信息(包括文件名、行号、函数名等)。

  • 堆栈回溯:自动调用dump_stack(),打印当前线程的调用堆栈。

  • 非致命性:与BUG_ON()不同,WARN_ON() 不会导致内核崩溃,而是继续执行。

相关变体

  • WARN_ON_ONCE():仅第一次触发时打印警告,避免重复输出。

  • WARN():直接打印警告信息,不依赖条件。

  • WARN_ON_MSG():在触发警告时附加自定义消息。

例子

#include <linux/kernel.h>

void my_function(int *ptr)
{
    // 检查指针是否为 NULL
    if (WARN_ON(!ptr)) {
        pr_err("Invalid pointer detected!\n");
        return;
    }

    // 正常逻辑
    ...
}

输出

[30397.610112] CPU: 4 PID: 9691 Comm: insmod Tainted: G           OE      6.8.0-52-generic #53-Ubuntu
[30397.610116] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[30397.610118] RIP: 0010:hello_init+0x15/0xff0 [hello]
[30397.610125] Code: Unable to access opcode bytes at 0xffffffffc0977ffb.
[30397.610127] RSP: 0018:ffffab9182e6bb50 EFLAGS: 00010246
...

BUG_ON