У меня вопрос о assert()
в Linux: могу ли я использовать его в ядре?
Если нет, какие методы вы обычно используете, например, я не хочу вводить указатель NULL?
У меня вопрос о assert()
в Linux: могу ли я использовать его в ядре?
Если нет, какие методы вы обычно используете, например, я не хочу вводить указатель NULL?
Соответствующие макросы ядра: BUG_ON
и WARN_ON
. Первый - это когда вы хотите сделать панику ядра и привести систему в состояние (то есть, невосстановимую ошибку). Последнее относится к тому, когда вы хотите что-то записывать в журнал ядра (просматривать через dmesg
).
Как говорит @Michael, в ядре вам нужно проверить все, что приходит из пользовательского пространства, и просто обрабатывать его, что бы это ни было. BUG_ON и WARN_ON должны ловить ошибки в вашем собственном коде или проблемы с оборудованием.
Один вариант - использовать макрос BUG_ON()
. Это будет printk
сообщение, а затем panic()
(т.е. Сбой) ядра.
http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel
Конечно, это следует использовать только в качестве стратегии обработки ошибок в крайнем случае (точно так же, как assert
)...
Нет. Если вы не работаете с ядром ядра и, скорее, с модулем, вы должны сделать все возможное, чтобы никогда не разбивать ядро (технически, abort()
). Если вы не хотите использовать указатель NULL, просто не выполняйте его. Проверьте его перед использованием и создайте журнал ошибок, если он есть.
Самое близкое, что вам может понадобиться, если вы действительно обрабатываете фатальный случай, - это функция panic()
или BUG_ON
и WARN_ON
, которые прекратят выполнение и выдадут диагностические сообщения, трассировку стека и список модулей.
Ну, разворачивание нулевого указателя приведет к созданию oops, которое вы можете использовать, чтобы найти код нарушения. Теперь, если вы хотите утвердить() данное условие, вы можете использовать
BUG_ON(condition)
Менее летальным механизмом является WARN_ON, который будет генерировать обратную трассировку без сбоев ядра.
BUG_ON()
- это подходящий подход для этого. Он проверяет правильность условия и вызывает макрос BUG()
.
Как BUG()
обрабатывает остальные, очень хорошо объясняется в следующей статье:
Я использую этот макрос, он использует 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)