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?

¿Fue útil?

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:

http://kernelnewbies.org/faq/bug

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top