繁体   English   中英

在Linux内核中使用断言

[英]Using assertion in the Linux kernel

我对Linux中的assert()有疑问:我可以在内核中使用它吗?

如果不是,你通常使用什么技术,例如我不想输入NULL指针?

相应的内核宏是BUG_ONWARN_ON 前者用于何时使内核崩溃并使系统停机(即不可恢复的错误)。 后者适用于您希望将内容记录到内核日志(可通过dmesg查看)的情况。

正如@Michael所说,在内核中,你需要验证来自用户空间的任何东西,只需处理它 ,无论它是什么。 BUG_ON和WARN_ON用于捕获您自己的代码中的错误或硬件问题。

一种选择是使用宏BUG_ON() 它将printk消息,然后panic() (即崩溃)内核。

http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel

当然,这只应该用作最后的错误处理策略(就像assert一样)......

否。除非您正在处理内核核心而不是模块,否则您应该尽力避免崩溃(技术上, abort() )内核。 如果您不想使用NULL指针, 请不要这样做 在使用之前检查它,如果是,则生成错误日志。

如果您实际处理致命案例,您可能想要做的最接近的事情是panic()函数或BUG_ONWARN_ON宏,它们将中止执行并生成诊断消息,堆栈跟踪和模块列表。

好吧,取消引用空指针将产生一个oops,您可以使用它来查找有问题的代码。 现在,如果你想断言()一个给定的条件,你可以使用

BUG_ON(condition)

一个不那么致命的机制是WARN_ON,它会产生一个回溯而不会崩溃内核。

BUG_ON()是这样做的合适方法。 它检查条件是否为真并调用宏BUG()

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM