我有一个关于assert()
Linux 的问题:我可以在内核中使用它吗?
如果不是,您通常使用什么技术,例如我不想输入 NULL 指针?
我有一个关于assert()
Linux 的问题:我可以在内核中使用它吗?
如果不是,您通常使用什么技术,例如我不想输入 NULL 指针?
对应的内核宏是BUG_ON
和WARN_ON
。前者用于当您想要使内核崩溃并导致系统崩溃(即,不可恢复的错误)时。后者适用于您想要将某些内容记录到内核日志(可通过 查看dmesg
)。
正如@Michael 所说,在内核中,您需要验证来自用户空间的任何内容并处理它,无论它是什么。BUG_ON 和 WARN_ON 用于捕获您自己的代码中的错误或硬件问题。
不。除非您正在处理内核核心而不是模块,否则您应该尽最大努力避免(从技术上讲abort()
)内核崩溃。如果您不想使用 NULL 指针,请不要这样做。使用前检查它,如果是,则生成错误日志。
如果您实际上正在处理致命案例,您可能想做的最接近的事情是panic()
函数或BUG_ON
andWARN_ON
宏,它们将中止执行并产生诊断消息、堆栈跟踪和模块列表。
一种选择是使用宏BUG_ON()
。它将printk
一条消息,然后panic()
(即崩溃)内核。
http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel
当然,这应该只作为最后手段的错误处理策略(就像assert
)......
好吧,取消引用空指针会产生一个 oops,您可以使用它来查找有问题的代码。现在,如果你想 assert() 一个给定的条件,你可以使用
BUG_ON(condition)
一个不那么致命的机制是 WARN_ON,它会在不使内核崩溃的情况下产生回溯。
我使用这个宏,它使用 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)