Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Débogage et diagnostics

Entrées / sorties et fichiers Les nouveautés introduites par C99


Accès rapide :
Compiler avec les warnings
Utiliser gdb
Placer des assertions
Diagnostiquer les erreurs mémoire
Une méthode simple

En C, le compilateur et les outils de diagnostic sont vos premiers alliés. Un programme peut se compiler tout en restant faux, mais un warning ignoré est souvent le premier indice d'un vrai problème. Prenez donc l'habitude de compiler tôt, souvent, et avec un niveau de warnings suffisant.

Compiler avec les warnings

L'option -Wall active un ensemble de warnings très utiles. Vous pouvez la compléter avec -Wextra et, lorsque vous travaillez sur des conversions numériques délicates, avec -Wconversion.

$> gcc -Wall -Wextra -g -o sample sample.c

L'option -g ajoute les informations nécessaires au débogueur. Elle ne corrige rien par elle-même, mais elle rend votre exécutable beaucoup plus exploitable avec des outils comme gdb.

Utiliser gdb

Le débogueur gdb permet de lancer un programme pas à pas, de poser des points d'arrêt et d'afficher la pile d'appels après un crash. C'est particulièrement utile pour comprendre une erreur de segmentation.

$> gdb ./sample
(gdb) break main
(gdb) run
(gdb) next
(gdb) print value
(gdb) backtrace

Placer des assertions

La macro assert permet de documenter une hypothèse que le programme considère comme vraie. Si cette hypothèse devient fausse durant l'exécution, le programme s'arrête immédiatement. Cela permet de détecter une erreur au plus près de son origine.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
#include <assert.h>

int divide( int left, int right ) {

    assert( right != 0 );
    return left / right;
}
Utilisation de assert

Diagnostiquer les erreurs mémoire

Les fuites mémoire, les écritures hors limites et les doubles libérations sont parfois difficiles à voir dans le code. Des outils comme valgrind ou les sanitizers de GCC et Clang permettent de les détecter beaucoup plus rapidement.

$> gcc -Wall -g -fsanitize=address -o sample sample.c
$> ./sample

Ces outils ne remplacent pas une bonne lecture du code, mais ils donnent des diagnostics précis, souvent avec le nom du fichier et le numéro de ligne concernés.

Une méthode simple

Quand un bug apparaît, commencez par le réduire. Reproduisez-le avec le plus petit jeu de données possible, activez les warnings, vérifiez les valeurs de retour, puis utilisez le débogueur si le problème persiste. En C, cette discipline fait gagner beaucoup plus de temps qu'elle n'en coûte.

Entrées / sorties et fichiers Les nouveautés introduites par C99




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé