Anda di halaman 1dari 9

Dboguer avec Code::Blocks - Partie I

Informations sur le tutoriel


Auteur : Nanoc Difficult : Licence : Plus d'informations

Popularit
Visualisations : 123 541 Apprciation 1 des lecteurs :2 3 139 168 personnes souhaitent voir ce tutoriel publi en livre ! Vous aussi ?

Publicit Historique des mises jour


Le 22/10/2010 12:50:27 Correction d'une erreur de syntaxe, alerte #3102 Le 16/10/2010 10:58:29 Correction d'une coquille (tableau statique <-> tableau la C) Le 08/10/2010 22:51:08 Ajout de tags

Partager
Imprimer Convertir en PDF Email Twitter Facebook Plus de services Dans ce chapitre, vous allez apprendre dboguer un programme. On parle de bogue (ou bug) dans un programme quand ce dernier compile mais plante lors de son excution. Ces bogues sont souvent difficiles dtecter rien qu'en lisant le code, car d'une part on ne sait pas quelle ligne cause l'erreur et on ne connat souvent pas non plus la valeur des diffrentes variables au moment du plantage. Heureusement, il existe des programmes appels dbogueurs, ou dvermineurs ( dans nos recherches d'erreurs. ) si on francise, qui permettent de nous aider

Dans ce chapitre, je vais vous prsenter l'aide d'un exemple simple le dbogueur qui est inclus dans Code::Blocks. Sommaire du chapitre :

Un programme bien mystrieux Prparer son code Trouver la ligne de l'erreur Connatre les valeurs des variables

Un programme bien mystrieux


Un programme en apparence inoffensif...
Pour comprendre l'utilit de cet outil merveilleux qu'est le dbugueur, je vous propose de passer par un exemple. Prenons par exemple le code suivant : Code : C++ - Oh le vilain bug ! - Slectionner #include <iostream> using namespace std; void f(int a); int main() { f(512); return 0; } void f(int donnee) { int resultat,temp; resultat = 8*donnee*donnee*donnee-1; temp = 2*resultat; resultat = temp+1; temp = resultat+1; resultat *= 4; temp *= 2; resultat/=temp; cout << resultat << endl; }

Ce code n'est pas crit dans un trs bon style, mais il semble apparemment tout fait inoffensif.

... mais qui cache bien son jeu.


Pourtant, si vous le compilez et le lancez, vous obtiendrez un message d'erreur. Sous Vista, vous pourriez par exemple obtenir la fentre suivante :

Le message d'erreur peut tre trs diffrent selon votre systme d'exploitation. Sous UNIX, vous aurez plutt un message dans votre console. Pour le moment, cliquez simplement sur "Fermer le programme". Je vous mets au dfi de trouver l'erreur dans ce programme rien qu'en lisant le code. Les plus malins se douteront peut-tre que l'erreur a lieu au moment de la division puisque c'est la seule opration potentiellement risque si le diviseur vaut 0.

Une mauvaise solution


Une ide que l'on voit parfois parmi les programmeurs dbutants est d'essayer de reprer l'erreur en plaant une ligne du type : Code : C++ - Slectionner std::cout << "Ligne 22" << std::endl;

entre chaque instruction du code source. Ceci permet effectivement de trouver la ligne o se situe l'erreur et permet aussi d'afficher la valeur des variables en faisant des lignes du type : Code : C++ - Slectionner std::cout << "Ligne 187, La variable a vaut : " << a << std::endl;

Mais si vous avez normment de lignes de code et en plus un grand nombre de variables, vous perdrez normment de temps faire cela. De plus si l'erreur provient d'une mauvaise manipulation de pointeurs, vous aurez beaucoup de peine la trouver. Le moyen le plus efficace passe par le dbogage de son programme l'aide d'un outil appropri.

Prparer son code


Changer le programme
Pour dboguer un programme, il faut tout d'abord le prparer pour cela. Quand vous lancez votre programme, il n'y a aucun moyen de connatre depuis l'extrieur la valeur des variables qui sont utilises par ce dernier. Il faut donc modifier le programme pour que le dbogueur puisse avoir accs ces valeurs.

Mais si on doit modifier le code source, alors autant faire des std::cout partout, a ira plus vite !

Attention ! J'ai dit qu'il fallait modifier le programme, pas le code source. Rappelez-vous les premiers chapitres, quelle est la chose qui crit le programme en langage machine ? Le compilateur ! Il faut donc dire au compilateur que l'on voudra dboguer le programme qu'il compile. Il faut pour cela modifier les options de compilation.

Modifier les options de compilation


Sous Code::Blocks c'est trs simple, il suffit de changer la cible de compilation pour passer en mode Debug. Cela se fait au moyen du petit menu droulant suivant :

Vous pouvez alors vrifier que le compilateur va bien ajouter les symboles ncessaires au dboguage en ouvrant la fentre Project -> Build Options... Vous devriez avoir une fentre de ce type qui s'ouvre devant vous :

L'important est que la ligne "Produce debugging symbols [-g]" soit coche et que la ligne "Strip all symbols from binary (minimizes size) [-s]" ne soit pas coche.

Recompiler son code


Il faut alors recompiler son programme pour prendre en compte les modifications faites. Je vous conseille de faire "Rebuild" (Ctrl-F11) et pas simplement "Build" pour tre sr que tous les fichiers seront bien recompils avec les nouvelles options. Tout est maintenant prt pour passer aux choses srieuses.

Trouver la ligne de l'erreur


Prsentation des boutons lis au dbogueur
Sous Code::Blocks, vous devriez avoir une petite barre d'outils que vous n'avez jamais utilise. Il s'agit de la barre suivante :

Si vous ne l'avez pas, vous pouvez l'ajouter en faisant View -> Toolbars -> Debugger . Cette barre est compose de 9 boutons. Je vous les prsente en vitesse, nous les verrons en dtails plus loin dans ce chapitre et dans le suivant.

Debug/Continue (F8) - Excute le programme jusqu'au point d'arrt suivant ou jusqu' la prochaine erreur. Run to cursor (F4) - Excute le programme jusqu' la ligne du code o se trouve la souris. Next line (F7) - Passe la ligne de code suivante. Next instruction (Alt-F7) - Passe l'instruction suivante. Step into (Ctrl-F7) - Entre dans la porte. Step out (Ctrl-Alt-F7) - Sort de la porte. Stop debugger (-) - Arrte le programme.

Les deux derniers servent choisir quelles informations vous voulez afficher.

Trouver une erreur


Pour trouver l'erreur, il va falloir excuter le programme et comme on ne sait pas encore quelle ligne se trouve le problme, nous allons lancer l'excution jusqu' ce qu'on arrive une erreur. Il faut donc cliquer sur "Debug/Continue". Comme prcdemment, le programme va planter. Sous windows, j'obtiens la fentre suivante :

nouveau, la fentre sera diffrente selon votre OS.

Cette fentre me donne dj plusieurs informations malgr son caractre un peu hostile. Premirement, je vois que l'erreur qui a caus le plantage est une Arithmetic exception. Cela veut dire que c'est une erreur de calcul qui s'est produite. La deuxime information importante est que le dbogueur a pu garder une trace de l'erreur. De plus il nous propose de voir cette trace. Je vous invite donc cliquer sur Oui . ce moment l apparat une nouvelle fentre.

Elle prsente un tableau de toutes les fonctions qui sont en cours d'excution. On parle de pile d'appel des fonctions. Par dfaut les fonctions sont classes selon leur position sur la pile. La plus haute tant la fonction dans laquelle s'est produit le plantage. La fonction directement en-dessous tant la fonction qui a appel la fonction qui a plant. Et ainsi de suite... On trouvera donc, dans les cas normaux, la fonction main la dernire ligne du tableau, puisque c'est elle qui ralise les premiers appels de fonctions. La pile d'appel peut tre assez grande selon ce que vous avez fait dans votre programme. Ne soyez pas surpris s'il semble qu'il y a plus de fonctions que ce que vous avez crit. La 3e colonne nous donne le nom de la fonction avec la valeur des arguments qu'elle a reus. On voit par exemple ici que la variable qu'a reue la fonction f est bien 512, comme on l'attendait. La 4e colonne nous donne une information prcieuse, le fichier dans lequel s'est produit l'erreur. Cela semble stupide ici, mais si vous avez des dizaines de fichiers, ce n'est pas si anodin que a. Et enfin la dernire colonne nous donne la ligne o se trouvait l'ordinateur dans chacune des fonctions au moment du plantage. Comment se fait-il que l'ordinateur se trouve deux endroits diffrents du code ?

Il ne se situe en ralit qu' un seul endroit. Si vous regardez le fichier source, vous verrez que la ligne 8 correspond la ligne d'appel de la fonction f. Le programme s'est donc arrt la ligne 8 du main pendant l'appel la fonction f. Et plus prcisment, la ligne 23 de cette fonction. La ligne 23 correspond la ligne o se situe la division. Il nous faudrait cependant plus d'informations sur les valeurs des variables pour dtecter ce qui cause l'erreur.

Connatre les valeurs des variables


Placer un point d'arrt
La premire chose faire est de dfinir un point jusqu'au quel le programme devra s'excuter. Le mieux dans notre cas serait d'excuter le programme jusqu'au dbut de la fonction f. Pour placer un point d'arrt (breakpoint), c'est trs simple. Il suffit de cliquer sur la bande grise ct du code l'endroit o l'on souhaite le placer. Un rond rouge devrait apparatre.

On peut placer autant de points d'arrts que l'on veut.

Vous pouvez connatre la liste de tous les points d'arrts de votre code source en affichant la liste des points d'arrts. Elle se trouve dans le menu Debug -> Debugging windows -> Breakpoints. On peut alors excuter nouveau le programme en cliquant sur "Debug/Continue" (F8). Le programme s'excute alors jusqu' la ligne o se situe le point rouge puis il attend. On aurait galement pu placer le curseur cette ligne et cliquer sur "Run to cursor". Le rsultat aurait t le mme.

Vous pouvez en tout temps connatre le point o se situe l'ordinateur en cherchant la petite flche jaune dans la bande grise.

Avancer d'un pas


On peut ensuite avancer d'un pas en appuyant sur "Next line" (F7) ou "Next instruction" si vous avez plusieurs instructions sur la mme ligne. Vous devriez voir la petite flche jaune avancer dans le code source et le programme s'excuter.

Si vous allez assez loin, vous allez arriver la ligne 23 et faire nouveau planter le programme. Il n'y a aucun moyen de reculer, vous ne pouvez qu'avancer dans le code source.

Revenons donc notre point d'arrt. Pour ce faire, il faut arrter le dbogueur et le relancer.

Afficher la valeur des variables


On peut connatre la valeur de toutes les variables prsentes dans une porte en ouvrant la fentre "Watches". Elle se trouve dans le menu Debug->Debugging windows->Watches. Si vous vous situez au point d'arrt, la fentre devrait afficher ceci :

Vous avez en premier les deux variables dclares dans la fonction avec leurs valeurs ce moment-l et ensuite la valeur des arguments que la fonction a reus. Si vous avancez dans le programme, toujours avec F7, vous verrez les valeurs des deux variables changer. La dernire modification s'affiche en plus en rouge de sorte que l'on puisse bien suivre ce qui se passe.

Si vous continuez comme a jusqu' la ligne qui cause le plantage, vous verrez que la variable temp prend la valeur 0 et que par consquent la division par temp est une opration illgale. Comment temp peut-il valoir 0 ? Cette question n'a rien voir avec le chapitre, mais la raison est assez simple. Un char ne peut contenir que des valeurs comprises entre -128 et 127. Si vous faites 127 + 1, vous obtiendrez -128. Par consquent, en jouant astucieusement avec les additions et les multiplications, on arrive retrouver la valeur 0. Pour les entiers c'est la mme chose, les bornes sont juste plus grande que -128 et 127. Nous avons donc pu grce, au dbogueur, reprer l'erreur et voir quelle en a t la cause. On peut donc dduire de ces informations que c'est la valeur 512 passe la fonction f qui cause l'erreur. Il faudrait donc corriger et mettre une valeur diffrente, par exemple 511. Le programme ne plante alors plus. Si vous modifiez le code source, vous devez recompiler le programme.

Notre objectif est donc atteint, nous avons pu reprer la ligne qui cause un crash du programme, trouver les causes de ce plantage en observant la valeur des variables et finalement corriger cette erreur. Dans le prochain chapitre, nous verrons comment dboguer des programmes un peu plus complexes faisant intervenir des pointeurs.

Anda mungkin juga menyukai