在Linux内核中使用断言

| 我在Linux中有一个关于“ 0”的问题:我可以在内核中使用它吗? 如果不是,例如,如果我不想输入NULL指针,通常使用什么技术?     
已邀请:
        相应的内核宏是
BUG_ON
WARN_ON
。前者适用于您希望使内核崩溃并导致系统崩溃的情况(即不可恢复的错误)。后者用于要将某些内容记录到内核日志中(可通过
dmesg
查看)。 就像@Michael所说的那样,在内核中,您需要验证来自用户空间的任何内容并对其进行处理,无论它是什么。 BUG_ON和WARN_ON将捕获您自己的代码中的错误或硬件问题。     
        一种选择是使用宏“ 4”。它将“ 5”个消息,然后“ 6”(即崩溃)内核。 http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel 当然,这只能用作不得已的错误处理策略(就像
assert
)...     
        不会。除非您正在内核内核上工作,而在模块上工作,否则应尽力避免崩溃(从技术上讲,
abort()
)。如果您不想使用NULL指针,那就不要这样做。在使用它之前检查它,并产生一个错误日志。 如果您实际上正在处理一个致命的情况,最可能要执行的操作是
panic()
函数或
BUG_ON
WARN_ON
宏,它们将中止执行并产生诊断消息,堆栈跟踪和模块列表。     
        好吧,取消引用空指针将产生一个oop,您可以使用它们来查找有问题的代码。现在,如果要断言()给定条件,则可以使用
BUG_ON(condition)
致命性较小的机制是WARN_ON,它将产生回溯而不会导致内核崩溃。     
        
BUG_ON()
是执行此操作的适当方法。它检查条件是否为真,并调用宏“ 14”。 下一篇文章很好地解释了
BUG()
如何处理其余部分: http://kernelnewbies.org/FAQ/BUG     
        我使用此宏,它使用BUG()但添加了一些我通常用于调试的信息,当然,如果愿意,您可以对其进行编辑以包括更多信息:
#define ASSERT(x)                                                       \\
do {    if (x) break;                                                   \\
        printk(KERN_EMERG \"### ASSERTION FAILED %s: %s: %d: %s\\n\",      \\
               __FILE__, __func__, __LINE__, #x); dump_stack(); BUG();  \\
} while (0)
    

要回复问题请先登录注册