Использование утверждения в ядре Linux - PullRequest
28 голосов
/ 15 июня 2011

У меня вопрос по поводу assert() в Linux: могу ли я использовать его в ядре?

Если нет, какие методы вы обычно используете, если, например, я не хочу вводить указатель NULL?

Ответы [ 6 ]

41 голосов
/ 15 июня 2011

Соответствующие макросы ядра: BUG_ON и WARN_ON.Первый предназначен для случаев, когда вы хотите вызвать панику в ядре и отключить систему (т. Е. Неисправимая ошибка).Последнее предназначено для записи чего-либо в журнал ядра (доступно для просмотра через dmesg).

Как говорит @Michael, в ядре вам нужно проверить все, что поступает из пространства пользователя, и просто справиться с этим , что бы это ни было.BUG_ON и WARN_ON должны обнаруживать ошибки в вашем собственном коде или проблемы с оборудованием.

7 голосов
/ 15 июня 2011

Один из вариантов - использовать макрос BUG_ON(). Это будет printk сообщение, а затем panic() (т.е. сбой) ядра.

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

Конечно, это следует использовать только как стратегию обработки ошибок последней инстанции (как и assert) ...

6 голосов
/ 15 июня 2011

Нет.Если вы не работаете над ядром ядра, а скорее над модулем, вы должны приложить все усилия, чтобы никогда не вывести из строя (технически, abort()) ядро.Если вы не хотите использовать нулевой указатель, просто не делайте этого .Проверьте его перед использованием и создайте журнал ошибок, если он есть.

Ближайшая вещь, которую вы могли бы захотеть сделать, если вы на самом деле работаете со смертельным случаем, это *Функция 1009 * или макросы BUG_ON и WARN_ON, которые прерывают выполнение и выдают диагностические сообщения, трассировку стека и список модулей.

4 голосов
/ 15 июня 2011

Ну, разыменование нулевого указателя приведет к появлению упс, который вы можете использовать, чтобы найти код, вызывающий сбой. Теперь, если вы хотите подтвердить () данное условие, вы можете использовать

BUG_ON(condition)

Менее смертоносный механизм - WARN_ON, который будет производить обратную трассировку без сбоя ядра.

0 голосов
/ 29 декабря 2012

Я использую этот макрос, он использует 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)
0 голосов
/ 16 мая 2012

BUG_ON() является подходящим подходом для этого.Он проверяет условие на истинность и вызывает макрос BUG().

Как BUG() справляется с остальными, очень хорошо объяснено в следующей статье:

http://kernelnewbies.org/FAQ/BUG

...