Debugging
Debugging d’un module
Le débogage des pilotes sous Linux pour des systèmes embarqués est relativement malaisé.
- L’utilisation de debugger, tel que
kgdb, peut naturellement est utilisé, mais généralement nécessite une infrastructure supplémentaire (par exemple probes JTAG). - La manière la plus simple est d’insérer à l’intérieur du code des
printf. Dans le noyau, cette technique peut être réalisée avec la méthodeprintk, par exemple :printk (KERN_DEBUG "Here I am: %s:%s\n", __FILE__, __LINE__); - Ces messages sont stockés dans un tampon circulaire (cela évite de consommer trop de mémoire si le nombre de messages explose)
- Ces messages peuvent également être affichés sur la console après
avoir passé un filtre dont le niveau est spécifié par le paramètre du
noyau
loglevelou par/proc/sys/kernel/printk(voirDocumentation/sysctl/kernel.txt) - La commande
dmesgpermet de lire les messages, par exemple$ dmesg | tail -n10 - Il existe 8 niveaux de sévérité, du plus haut (0) au plus bas (7):
<0> KERN_EMERG Used for emergency messages, usually those that precede a crash. <1> KERN_ALERT A situation requiring immediate action. <2> KERN_CRIT Critical conditions, often related to serious hardware or software failures. <3> KERN_ERR Used to report error conditions; device drivers often use KERN_ERR to report hardware difficulties. <4> KERN_WARNING Warnings about problematic situations that do not, in themselves, create serious problems with the system. <5> KERN_NOTICE Situations that are normal, but still worthy of note. A number of security-related conditions are reported at this level. <6> KERN_INFO Informational messages. Many drivers print information about the hardware they find at startup time at this level. <7> KERN_DEBUG Used for debugging messages. - L’usage de la fonction
printkn’est plus recommandé lors de développement de nouveaux modules. On lui préférera les fonctions spécialiséespr_xxxpr_emerg(),pr_alert(),pr_crit(),pr_err(),pr_warning(),pr_notice(),pr_info()pr_debug()(le module doit être compilé avec le flag-DDEBUG, pour plus de détails https://www.kernel.org/doc/local/pr_debug.txt)