Usando la afirmación en el núcleo de Linux
-
28-10-2019 - |
Pregunta
Tengo una pregunta sobre assert()
En Linux: ¿Puedo usarlo en el núcleo?
Si no, ¿qué técnicas usas suele usar si, por ejemplo, no quiero ingresar un puntero nulo?
Solución
Las macros del núcleo correspondientes son BUG_ON
y WARN_ON
. El primero es para cuando quieres hacer el pánico del núcleo y derribar el sistema (es decir, un error irrecuperable). Este último es para cuando desea registrar algo al registro del núcleo (visible a través de dmesg
).
Como dice @Michael, en el núcleo, debe validar cualquier cosa que provenga del espacio de usuario y solo manejarlo, lo que sea que es. Bug_on y Warn_on son para atrapar errores en su propio código o problemas con el hardware.
Otros consejos
Una opción sería usar la macro BUG_ON()
. Va a printk
un mensaje, y luego panic()
(es decir, choque) El núcleo.
http://kernelnewbies.org/kernelhacking-howto/debugging_kernel
Por supuesto, esto solo debe usarse como una estrategia de manejo de errores del último recurso (al igual que assert
)...
No. A menos que esté trabajando en el núcleo del kernel y, más bien en un módulo, debe hacer todo lo posible para nunca bloquear (técnicamente, abort()
) el núcleo. Si no quieres usar un puntero nulo, solo No lo hagas. Compruébelo antes de usarlo y produzca un registro de errores si es así.
Lo más cercano que tu puede que quiero hacer si realmente manejas un caso fatal es el panic()
función o el BUG_ON
y WARN_ON
Las macros, que abortarán y producirán mensajes de diagnóstico, un rastro de pila y una lista de módulos.
Bueno, Dereferencing Null Pointer producirá un OOPS, que puede usar para encontrar el código ofensivo. Ahora, si desea afirmar () una condición dada, puede usar
BUG_ON(condition)
Un mecanismo menos letal es Warn_on, que producirá un retroceso sin estrellar el núcleo.
BUG_ON()
es el enfoque apropiado para hacerlo. Verifica que la condición sea verdadera y llama a la macro BUG()
.
Cómo BUG()
Maneja el resto se explica muy bien en el siguiente artículo:
Utilizo esta macro, usa Bug () pero agrega más información que normalmente uso para la depuración y, por supuesto, puede editarla para incluir más información si lo desea:
#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)