在Linux内核中使用断言

mac*_*ows 28 linux assert assertions linux-kernel assertion

assert()在Linux中有一个问题:我可以在内核中使用它吗?

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

Nem*_*emo 42

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

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


sle*_*ske 7

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

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

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


Mic*_*kis 6

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

你最接近的事可能想要做的,如果你实际处理一个致命的情况是panic()功能或BUG_ONWARN_ON宏,将中止执行并产生诊断消息,堆栈跟踪和模块的列表.


sho*_*nex 5

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

BUG_ON(condition)
Run Code Online (Sandbox Code Playgroud)

一种不太致命的机制是 WARN_ON,它会在不使内核崩溃的情况下生成回溯。