# Débogage avancé

| Chap. 1 : | Outils d'aide au débogage et fondamentaux |
| Chap. 2 : | La mémoire |
| TP 1 : | Pile d'appels |
| TP 2 : | Débordement de pile |
| TP 3 : | Double libération |
| TP 4 : | Allocation: 0, Libération: 1 |
| TP 5 : | Débogage à la volée |
| TP 6 : | Observation à la loupe |
| TP 7 : | Allocation dans la pile |

## Présentation [Modifier]

Le débogage est l'une des activités principales lors du développement d'un logiciel. Pour aider le programmeur, plusieurs outils existent. Comprendre ces outils et en maîtriser les différents aspects au-delà des bases permet de gagner du temps. Cette leçon se concentre sur le débogage en C, dont les pointeurs, véritable opérateur de description des contenus mémoire, permettent de créer des bugs subtils avec un petit nombre de lignes de code.
Cette leçon est construite pour revenir, globalement, et par la pratique (les travaux pratiques), sur les différents points nécessaires à la compréhension d'une exécution (Algorithmique, Programmation, Compilation, Système d'exploitation, Architecture des ordinateurs). Le débogage est l'une des activités en Informatique qui nécessite la mobilisation simultanée de tous ces points.
Les exercices consistent en : compiler un petit code C ayant un type de bug particulier, exécuter le code compilé et comprendre l'état du processus au moment du bug avec différentes techniques et outils.
N'hésiter pas à regarder la solution d'un TP, même avant d'avoir commencer à le faire. Les réponses sont construites pour être des mini-tutoriaux d'appropriations des outils et de rappels des pré-requis par la pratique.
Les chapitres ont pour but d'expliciter et de revenir brièvement sur plusieurs des points abordés dans chaque TP.

## Objectifs [Modifier]

Pour pouvoir correctement déboguer, le programmeur doit trouver la différence entre ce qui a été prévu et ce qui est implémenté. Pour cela, il doit construire une image mentale correct de ce qui se passe globalement dans son processus afin de pouvoir la comparer avec son autre image mentale de ce qui aurait dû se passer.
L'algorithmique utilisée dans le programme, ses structures de données et la programmation de cet algorithme (langage utilisé, expression des structures de données, fabrication de l'exécutable, exécution ou interprétation du script) sont les premières fondations utilisées dès les premiers débogages réalisés en ajoutant des 'print', 'printf' ou 'puts' au milieu du code.
Néanmoins, dès que le code devient un peu technique, que l'espace d'état du programme devient grand, ou bien que l'exécution est longue ou complexe (par exemple une exécution parallèle multi-threadée), il faut pouvoir inspecter tout le processus pendant son exécution afin de comprendre son état actuel.
Reconstruire mentalement son état implique alors de prendre en compte et de mobiliser des connaissances en compilation (code, données, mécanisme d'appel des fonctions, pile, tas), en système d'exploitation (allocation dynamique de mémoire, protection de la mémoire, thread, pile), et en architecture des ordinateurs (registres, assembleur, mémoire virtuelle).
Cette leçon porte sur les outils et rappelle les différents fondamentaux qui aident au débogage.

## Niveau et prérequis conseillés [Modifier]

Leçon de niveau 17.
Le niveau 17 de cette leçon vient surtout du panel large de pré-requis en Informatique. Les fondamentaux de chaque point peuvent suffire.

### Globalement

* Algorithmique
* Introduction au langage C
* Compilation
* Systèmes d'exploitation
* Architecture des ordinateurs
* Introduction générale à la programmation

### Spécifiquement pour pouvoir faire les travaux pratiques

* une distribution GNU/Linux récente grand public fournit tous les outils de la suite de cette liste.
* un émulateur de terminal et savoir manipuler les commandes de base d'Unix dans ce terminal
* un compilateur C (GCC dans les exemples et corrections, Clang devrait fonctionner aussi). Privilégié la version du compilateur la plus récente possible car ils améliorent les retours pour le programmeur au fil des versions.
* le débogueur GDB (certains exercices et corrections sont spécifiques à GDB, l'adaptation partielle à d'autres est possible)
* Valgrind
* la bibliothèque AddressSanitizer (ASan) (utilisée par le compilateur)
* un éditeur de texte ou un environnement de développement pour pouvoir taper le code C

## Référents [Modifier]

Ces personnes sont prêtes à vous aider concernant cette leçon :
* Mounieg (discuter)