Tengo una pregunta sobre assert()
En Linux: ¿Puedo usarlo en el kernel?
Si no, ¿qué técnicas usas habitualmente si, por ejemplo, no quiero ingresar el puntero NULO?
Respuestas
40 para la respuesta № 1Las 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 solo manejarlo, lo que sea que es. BUG_ON y WARN_ON son para detectar errores en su propio código o problemas con el hardware.
7 para la respuesta № 2
Una opción sería utilizar la macro. BUG_ON()
. Va a printk
un mensaje, y luego panic()
(es decir, colapsa) el kernel.
http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel
Por supuesto, esto solo debe usarse como una estrategia de manejo de errores de último recurso (al igual que assert
) ...
5 para la respuesta № 3
No. A menos que esté trabajando en el núcleo del núcleo y más bien en un módulo, debe hacer todo lo posible para no fallar nunca (técnicamente, abort()
) el núcleo. Si no desea utilizar un puntero NULL, simplemente no lo hagas. Verifíquelo antes de usarlo y genere un registro de errores si lo es.
Lo mas cercano a ti podría querer hacer si realmente estás manejando un caso fatal es el panic()
función o la BUG_ON
y WARN_ON
Las macros, que abortarán la ejecución y producirán mensajes de diagnóstico, un seguimiento de la pila y una lista de módulos.
4 para la respuesta № 4
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.
0 para la respuesta № 5
BUG_ON()
Es el enfoque apropiado para hacerlo. Comprueba si la condición es verdadera y llama a la macro BUG()
.
Cómo BUG()
Maneja el resto se explica muy bien en el siguiente artículo:
http://kernelnewbies.org/FAQ/BUG
0 para la respuesta № 6
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: %sn",
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG();
} while (0)