Подтвердить что ты не робот

Использование утверждения в ядре Linux

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Самое близкое, что вам может понадобиться, если вы действительно обрабатываете фатальный случай, - это функция panic() или BUG_ON и WARN_ON, которые прекратят выполнение и выдадут диагностические сообщения, трассировку стека и список модулей.

Ответ 4

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

BUG_ON(condition)

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

Ответ 5

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

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

http://kernelnewbies.org/FAQ/BUG

Ответ 6

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