30

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

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

4

6 回答 6

44

对应的内核宏是BUG_ONWARN_ON。前者用于当您想要使内核崩溃并导致系统崩溃(即,不可恢复的错误)时。后者适用于您想要将某些内容记录到内核日志(可通过 查看dmesg)。

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

于 2011-06-15T14:58:54.290 回答
7

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

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

于 2011-06-15T14:55:51.297 回答
7

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

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

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

于 2011-06-15T14:58:31.857 回答
5

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

BUG_ON(condition)

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

于 2011-06-15T15:02:40.843 回答
1

我使用这个宏,它使用 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)
于 2012-12-28T22:35:17.950 回答
0

BUG_ON()是适当的方法来做到这一点。它检查条件是否为真并调用宏BUG()

BUG()下面的文章很好地解释了如何处理其余部分:

http://kernelnewbies.org/FAQ/BUG

于 2012-05-16T00:42:51.150 回答