mp3tag - tag editor linux
Usando aserciĆ³n en el kernel de Linux (6)
Bueno, al quitar la referencia al puntero nulo se producirá un error, que puede utilizar 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 que el núcleo se caiga.
Tengo una pregunta sobre assert()
en Linux: ¿puedo usarla en el kernel?
Si no, ¿qué técnicas usas habitualmente si, por ejemplo, no quiero ingresar el puntero NULO?
Las macros de kernel correspondientes son BUG_ON
y WARN_ON
. El primero es para cuando se desea que el kernel entre en pánico y desactive el sistema (es decir, un error irrecuperable). Este último es para cuando desea registrar algo en el registro del kernel (visible a través de dmesg
).
Como dice @Michael, en el kernel, necesita validar cualquier cosa que provenga del espacio de usuario y simplemente manejarlo , sea lo que sea. BUG_ON y WARN_ON son para detectar errores en su propio código o problemas con el hardware.
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 no bloquear (técnicamente, abort()
) el kernel. Si no quieres usar un puntero NULO, simplemente no lo hagas . Verifíquelo antes de usarlo y genere un registro de errores si lo es.
Lo más cercano que puede hacer si realmente está manejando un caso fatal es la función panic()
o las macros BUG_ON
y WARN_ON
, que WARN_ON
ejecución y producirán mensajes de diagnóstico, un seguimiento de la pila y una lista de módulos.
Una opción sería usar la macro BUG_ON()
. printk
un mensaje y, a continuación, printk
panic()
(es decir, bloqueará) el núcleo.
http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel
Por supuesto, esto solo debe usarse como una estrategia de manejo de errores de último recurso (como assert
) ...
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)
BUG_ON()
es el enfoque apropiado para hacerlo. Comprueba 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: