tag mp3tag kid3 editar easytag linux linux-kernel assert assertions assertion

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:

http://kernelnewbies.org/FAQ/BUG