Linux内核调试 | BUG_ON与WARN_ON与dump_stack的使用

  • 前言
  • 本篇环境
  • BUG_ON
    • BUG_ON的定义
    • BUG的用法
    • BUG_ON的用法
  • WARN_ON
    • WARN_ON的定义
    • WARN_ON的用法
  • dump_stack
    • dump_stack的用法
  • 测试代码示例
    • 测试结果展示
  • 总结

前言

前几篇我们讲了下Linux内核调试的文章,没看的同学可以看下。

Linux内核中为了方便方便标记 bug,提供断言并输出信息,最常用的两个API是 WARN_ON()BUG_ON()。当调用这两个宏的时候,它们会引发 OOPS,导致栈的回溯和错误消息的打印,方便我们底层开发者查看日志进行定位调试问题,所以也是我们要掌握的调试内容,本篇以做实验为目的来给大家分享下BUG_ON(),WARN_ON(),dump_stack()的使用。

本篇环境

硬件平台:飞凌OK3588开发板

内核源码:5.10.66-rt53

编译环境:Ubuntu 20.04 LTS

编译工具链:aarch64-linux-gnu-

BUG_ON

说起BUG_ON,先说下BUG宏,该宏用于在遇到严重错误时强制停止内核的执行。这种错误通常是致命的,并且无法通过简单的错误处理机制来解决。而BUG_ON宏是BUG宏的一个变种增加了断言,用于在某个条件成立时触发BUG。如果条件为真BUG_ON会触发一个BUG,否则不会有任何影响。

BUG_ON的定义

从定义实现可以看到,BUG_ON里的条件为真时,会触发panic

file:include/asm-generic/bug.h
#ifndef HAVE_ARCH_BUG
#define BUG() do { \
        printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
         barrier_before_unreachable(); \
         panic("BUG!"); \
} while (0)

#endif

#ifndef HAVE_ARCH_BUG_ON
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
#endif

BUG的用法

BUG在代码中我们可以这么做

#include 

void function() {
    // 代码逻辑
    if (some_critical_condition) {
        BUG();  // 这将停止内核执行并打印堆栈跟踪
    }
}

BUG_ON的用法

BUG_ON在代码中我们可以这么做

#include 

void function() {
    // 代码逻辑
    BUG_ON(some_critical_condition);  // 如果some_critical_condition为true,则触发BUG
}

你会发现BUG_ONBUG内部多了条件参数传入判断,BUG_ON 宏的典型用法是检查某个条件是否为真,如果为真就触发一个 BUG,终止内核的运行。

注意事项

  1. 避免在生产环境中使用:由于 BUGBUG_ON 会导致内核停止运行,它们通常只在开发和调试过程中使用。在生产环境中,应该使用更为温和的错误处理机制。

  2. 影响系统稳定性:触发 BUGBUG_ON 后,内核会停止运行,这会影响整个系统的稳定性,必须慎重使用。

  3. 明确使用场景BUGBUG_ON 应该只用于捕捉那些绝对不应该发生的错误情况。如果有可能通过其他方式进行错误处理,应该优先考虑那些方式。

你可能感兴趣的:(Linux内核,linux,linux内核)