Aller au contenu principal

🐞 DĂ©bogage et trace d'exĂ©cution

🎯 Objectif​

Utiliser le débogueur de Visual Studio de façon systématique et réaliser une trace d'exécution pour comprendre et corriger un programme qui contient des boucles et des tableaux.

Jusqu'ici, tu as surtout tracé du code simple (variables, if) au cours 2.2. Maintenant que tes programmes contiennent des boucles for imbriquées et des tableaux 2D, les lire de haut en bas ne suffit plus : il faut observer le programme pendant qu'il s'exécute.


1ïžâƒŁ Les trois familles d'erreurs​

Avant de déboguer, il faut savoir quel type d'erreur on a devant soi.

Type d'erreurQuand ?ExempleComment la trouver ?
Compilation (syntaxe)Avant l'exécutionConsol.WriteLine(...), ; manquantVisual Studio le souligne en rouge et refuse de compiler
ExĂ©cution (exception)Pendant l'exĂ©cutionIndexOutOfRangeException, FormatExceptionLe programme plante et Visual Studio s'arrĂȘte sur la ligne fautive
LogiquePendant l'exĂ©cutionLe total affichĂ© est 0, la grille est dĂ©calĂ©e❗ Le programme fonctionne, mais le rĂ©sultat est faux → c'est ici que le dĂ©bogueur devient indispensable
L'erreur de logique ne se signale jamais toute seule

Un programme qui compile et qui ne plante pas n'est pas un programme correct. C'est toi qui dois vérifier que le résultat est le bon.


2ïžâƒŁ La boĂźte Ă  outils du dĂ©bogueur​

🔮 Le point d'arrĂȘt (breakpoint)​

Un point d'arrĂȘt dit au programme : « arrĂȘte-toi juste avant d'exĂ©cuter cette ligne ».

  • Clique dans la marge grise Ă  gauche du numĂ©ro de ligne, ou appuie sur F9.
  • Un cercle rouge apparaĂźt. Lance le programme avec F5 : il s'arrĂȘte sur la ligne (surlignĂ©e en jaune).
  • La ligne jaune n'est pas encore exĂ©cutĂ©e.
OĂč placer son premier point d'arrĂȘt ?

Sur la premiÚre ligne du bloc que tu soupçonnes, pas au tout début de Main. Si le total d'une boucle est faux, place-le sur la ligne de la boucle, pas 40 lignes plus haut.

⌚ Les touches pour avancer​

ToucheNomCe que ça fait
F5ContinuerRepart et court jusqu'au prochain point d'arrĂȘt
F10Pas Ă  pas principal (Step Over)ExĂ©cute la ligne courante au complet et s'arrĂȘte Ă  la suivante
F11Pas à pas détaillé (Step Into)Entre à l'intérieur de la fonction appelée sur cette ligne
Maj + F11Pas Ă  pas sortant (Step Out)Termine la fonction courante et revient Ă  l'appelant
Maj + F5ArrĂȘterTermine la session de dĂ©bogage
F10 ou F11 ?

Utilise F10 pour parcourir ton code ligne par ligne. Utilise F11 seulement quand tu veux voir ce qui se passe dans une de tes fonctions. Sur un Console.WriteLine(...), F11 ne sert Ă  rien : c'est du code de Microsoft.

👀 Observer les variables​

Pendant que le programme est arrĂȘtĂ©, plusieurs façons de voir les valeurs :

  • Survoler une variable avec la souris → une infobulle affiche sa valeur.
  • FenĂȘtre Variables locales (Locals) → toutes les variables du bloc courant.
  • FenĂȘtre Automatique (Autos) → seulement les variables des lignes autour.
  • FenĂȘtre Espion (Watch) → tu y ajoutes ce que tu veux suivre, y compris une expression.
L'espion est ton meilleur ami avec les tableaux

Dans la fenĂȘtre Espion, tu peux Ă©crire une expression complĂšte et la voir se mettre Ă  jour Ă  chaque F10 :

  • grille[rangee, colonne] → la case courante
  • grille.GetLength(0) → le nombre de rangĂ©es
  • total / nbNotes → vĂ©rifier un calcul avant qu'il soit faux

Menu : DĂ©boguer → FenĂȘtres → Espion → Espion 1 (Ctrl + Alt + W, 1).

🔀 DĂ©plier un tableau​

Dans Variables locales, clique sur la ▾ Ă  gauche d'un tableau pour voir toutes ses cases. Pour un tableau 2D, les cases sont affichĂ©es sous la forme [0, 0], [0, 1], [1, 0]
 C'est le moyen le plus rapide de voir qu'une rangĂ©e est restĂ©e vide (0 partout).


3ïžâƒŁ Trace d'exĂ©cution d'une boucle​

La trace d'exĂ©cution est la version papier du dĂ©bogueur : on suit le programme instruction par instruction en notant l'Ă©volution des variables. Tu en as besoin Ă  l'examen, oĂč il n'y a pas de Visual Studio.

Exemple 1 — Boucle for avec accumulateur​

1. int[] notes = { 80, 90, 70 };
2. int total = 0;
3. for (int i = 0; i < notes.Length; i++)
4. {
5. total = total + notes[i];
6. }
7. Console.WriteLine(total);
Instruction exécutéeinotes[i]totalAffichage
2——0—
30800—
508080—
319080—
5190170—
3270170—
5270240—
33❌ n/a240—
73—240240
Le dernier tour compte

Remarque l'avant-derniĂšre ligne : i vaut 3, le test i < 3 est false, on sort de la boucle. C'est exactement ce que tu verras en appuyant sur F10 une fois de trop.

Exemple 2 — Boucles imbriquĂ©es sur un tableau 2D​

1. int[,] grille = { { 1, 2 },
{ 3, 4 } };
2. int somme = 0;
3. for (int rangee = 0; rangee < grille.GetLength(0); rangee++)
4. {
5. for (int colonne = 0; colonne < grille.GetLength(1); colonne++)
6. {
7. somme = somme + grille[rangee, colonne];
8. }
9. }
Instruction exécutéerangeecolonnegrille[rangee, colonne]somme
2———0
30——0
50010
70011
50121
70123
502❌ n/a3
31——3
51033
71036
51146
711410
512❌ n/a10
32——10
La boucle intérieure repart à zéro

colonne est redĂ©clarĂ©e Ă  0 Ă  chaque tour de la boucle extĂ©rieure. La boucle intĂ©rieure fait donc tous ses tours pour chaque rangĂ©e : 2 rangĂ©es × 2 colonnes = 4 passages par la ligne 7.


4ïžâƒŁ Les bogues classiques (et comment les repĂ©rer)​

❌ IndexOutOfRangeException​

int[] notes = { 80, 90, 70 };
for (int i = 0; i <= notes.Length; i++) // đŸ’„ <= au lieu de <
{
Console.WriteLine(notes[i]);
}

Un tableau de 3 Ă©lĂ©ments a les indices 0, 1, 2. Avec <=, on essaie de lire notes[3] → đŸ’„

👉 Au dĂ©bogueur : le programme s'arrĂȘte sur la ligne fautive. Survole i et notes.Length : tu verras 3 et 3.

❌ Les dimensions inversĂ©es​

for (int rangee = 0; rangee < grille.GetLength(1); rangee++) // đŸ’„ (1) au lieu de (0)

Sur une grille carrĂ©e (3 × 3), ce bogue ne plante jamais et ne se voit pas. Sur une grille 2 × 5, il plante ou saute des cases.

👉 Au dĂ©bogueur : ajoute grille.GetLength(0) et grille.GetLength(1) dans la fenĂȘtre Espion.

❌ L'accumulateur rĂ©initialisĂ© dans la boucle​

for (int i = 0; i < notes.Length; i++)
{
int total = 0; // đŸ’„ remis Ă  0 Ă  chaque tour
total = total + notes[i];
}

👉 Au dĂ©bogueur : place un point d'arrĂȘt sur la ligne du total et appuie sur F10 plusieurs fois. Tu verras total retomber Ă  0 Ă  chaque tour au lieu de grandir.

❌ Le WriteLine au mauvais endroit​

Un affichage dans la boucle intérieure au lieu de la boucle extérieure (ou l'inverse) donne une grille en une seule colonne, ou toutes les valeurs collées sur une ligne.

👉 Au dĂ©bogueur : F10 pas Ă  pas en gardant la fenĂȘtre Console visible Ă  cĂŽtĂ© de Visual Studio pour voir quand chaque caractĂšre est Ă©crit.


5ïžâƒŁ Une mĂ©thode en 5 Ă©tapes​

Devant un programme qui ne fonctionne pas, ne modifie pas le code au hasard đŸŽČ

  1. Reproduire — quelles entrĂ©es provoquent le problĂšme, Ă  tous les coups ?
  2. Situer — quelle est la derniĂšre ligne dont tu es certain qu'elle est correcte ? Place ton point d'arrĂȘt lĂ .
  3. Formuler une hypothĂšse — « je pense que colonne ne revient pas Ă  0 ».
  4. VĂ©rifier — F10 pas Ă  pas, en lisant les Variables locales ou l'Espion. L'hypothĂšse est confirmĂ©e ou Ă©liminĂ©e.
  5. Corriger, puis retester — et relancer aussi les cas qui fonctionnaient avant la correction.
Ne devine pas, mesure

« Ça devrait marcher » n'est pas un diagnostic. Le dĂ©bogueur te donne la vraie valeur de chaque variable : sers-t'en au lieu de supposer.


Vous devez réaliser le laboratoire suivant :