Sommaire Index Rechercher Liens A Propos
[LinuxFocus Image]
[Barre de Navigation]
  Nouvelles   Archives

Deboguer du Code avec ddd

par Jose Maria Laveda


Prologue

Qu'est ce qu'un d�bogueur?

Qu'est ce que DDD

L'interface Graphique

Commencer par le Bas

Le Mot de la Fin

"J'aime faire des erreurs, je ne souhaite pas renoncer � l'agr�able libert� de faire des erreurs."
Charles Chaplin

Prologue

Le but de cet article est de montrer quelque concepts de base aux utilisateurs qui n'ont jamais utilis� de d�bogueur auparavant, ou bien qui l'ont utilis� et cherchent un environnement graphique plus agr�able pour ce travail quotidien. On peut �crire beaucoup � propos des capacit�s et de la robustesse du d�bogueur d�crit (gdb) toutefois nous avons d�cid� de rester simple dans un but didactique, comme d'habitude :)

Qu'est ce qu'un d�bogueur?

(Bas� sur une histoire vrai ;) ).

" Il �tait une fois un programmeur dont la seule fa�on de trouver un bogue dans son code �tait:

/*Code*/
(...)
Boucle
changer_une_variable;
afficher_la_valeur_de_la_variable;
fin de boucle
(...)

Il �tait forc� d'ins�rer de nombreuses fois ces lignes dans son code source afin d'inspecter les valeurs des variables du programme pendant l'ex�cution. C'�tait une t�che difficile qui lui co�tait deux fois plus de travail que d'�crire le programme(..)".

Qui ne s'est jamais trouv� dans une telle situation? Souvent il y a une erreur dans notre programme, nous avons tout chang� et essay�,. A ce point nous sommes presque convaincu que "c'est la faute du compilateur" car il ne reste que peu de choses � essayer.

Un d�bogueur permet de contr�ler l'ex�cution d'un programme pas � pas, de telle sorte qu'il est facile d'examiner l'�tat des variables, leur d�finition, ce qui se passerait dans certaines conditions, etc... Tout cela, encore une fois, de mani�re it�rative pendant que le code en cours de d�bogage s'ex�cute. Si cette d�finition de pi�ton n'est pas tr�s claire, j'esp�re la rendre plus transparente au long de l'article.

Que se passerait il si le programmeur de notre histoire avait un d�bogueur nomm� "spy" qui lui permettrait les choses suivantes:

jose# spy mon_programme

et si apr�s avoir appel� "spy" notre programmeur pouvait faire les choses suivantes:

spy > ex�cute mon_programme " jusqu'� la ligne 50"
spy > montre moi la valeur de la variable <X>
spy > quel est le type de la variable <X>

Tr�s probablement � ce moment notre programmeur imaginaire sauterait de joie parce qu'il aurait finalement trouv� la cause du bogue.

Il est clair que l'outil nomm� "spy" a �t� tr�s utile car il a laiss� le programmeur ex�cuter le programme � sa guise tout en examinant les valeurs et les d�finitions de variables du programme. Ceci est bien un DEBOGUEUR, grossi�rement caricatur� bien sur.

Avertissement !!: les d�bogueurs ne peuvent fonctionner qu'avec des programmes compil�s avec l'option d�bogue, "-g" dans le cas du compilateur GNU gcc.

Un outil de d�bogage est disponible pour tous les utilisateurs LINUX (et sur beaucoup d'autres plates-formes). C'est GDB " Le D�bogueur au niveau source GNU". Il est disponible pour le m�me prix et avec la m�me licence que le syst�me d'exploitation que vous utilisez probablement pour lire cet article, la Licence Publique G�n�rale GNU. Il permet de d�boguer du code �crit en C, C++, Modula-2 et assembleur.

Il y a de fortes chances pour qu'il soit inclus dans la distribution de Linux que vous utilisez. Sinon, changer de distribution ou procurez vous les sources quelque part sur Internet o� il est disponible � des millions d'endroits ;).

Disons que vous avez t�l�charg� les sources dans votre r�pertoire /usr/src, allez alors � "/usr/src/gdb-4.xxxx/gdb", tapez "./configure" et changez de r�pertoire vers "doc". L� vous pouvez construire la documentation en ex�cutant "make gdb.dvi;make refcard.dvi" les deux fichiers sont facilement visualisables ou imprimables sur tout syst�me Linux.

Qu'est ce que DDD?

Plut�t que de continuer avec une pr�sentation d�taill�e du fonctionnement de gdb et de ses commandes, il sera plus utile pour les novices de se familiariser avec un environnement beaucoup plus agr�able qui est "ddd" , ce qui signifie Display Data Debugger.

L'environnement ddd fournit une interface plus conviviale et plus facile � configurer pour une session de d�bogage. Toutefois, remarquez que ddd n'est qu'une interface graphique qui coiffe gdb, et que par cons�quent, ce dernier est n�cessaire � un son fonctionnement correct. En fait, ddd permet � l'utilisateur de manipuler gdb directement si n�cessaire. D'autres d�bogueurs peuvent �tre manipul�s avec ddd comme dbx et xdb.

Une bonne source d'information sur ddd est http://www.cs.tu-bs.de/softech/ddd/ et si vous utilisez Red Hat, les sources peuvent �tre trouv�es en format .rpm. Il peut y avoir deux versions de ddd, une compil� dynamiquement avec la biblioth�que Motif et l'autre statiquement. La version statique est pour les utilisateurs qui ne poss�dent pas la biblioth�que Motif

J'ignore volontairement la configuration de ddd vis � vis de LESSTIF (http://www.lesstif.org), Je ne connais pas l'�tat d'avancement de lesstif, une implantation gratuite de la biblioth�que graphique Motif. Il n'y a pas si longtemps, ddd ne se compilait et ne marchait avec lesstif que gr�ce � un patch; je l'ai utilis� sur un noyau 1.2.13 avec lesstif 0.75 (Je pense ;). Vous pouvez v�rifier sur le site du projet lesstif l'avancement de ce projet.

Arriv�s au point d'ex�cuter ddd, on obtient :


Figur2 1. Ecran principal de ddd

IL y a trois fa�ons diff�rentes d'appeler ddd; la pr�c�dente et les deux suivantes:

ddd <program> core
ddd <program> <process_id>

Le fichier nomm� "core" est produit chaque fois qu'un programme se plante et il contient des informations utiles � propos du statut du programme au moment de l'apparition de l'erreur. Si votre syst�me ne g�n�re pas de "core dumps" v�rifiez les variables d'environnement du core ('ulimit -a' les montre toutes, et 'ulimit -c <value>' d�finit la taille maximale d'autres valeurs int�ressantes).

Le proccess id permet d'inspecter le programme en cours d'ex�cution.

L'environnement graphique de ddd permet toujours d'ex�cuter une t�che de plusieurs mani�res; je ne peux pas toutes les d�crire, simplement les plus simples et les plus directes. Notez aussi que la fen�tre inf�rieure de la console principale ddd affiche une liste de toutes les transactions effectu�es par ddd. Cette fen�tre peut �tre tr�s utile pour apprendre le fonctionnement de gdb � partir de la ligne de commande.

L'environnement Graphique

La Figure 1 montre que la fen�tre principale est divis�e en trois. La partie inf�rieure correspond � la une "pure" console de d�bogage (gdb dans notre cas) ou l'on peut saisir directement des commandes gdb comme si l'on n'avait pas l'interface ddd. Le milieu affiche le code source du programme, et la partie sup�rieure est une interface graphique d�di�e aux variables et objets du programme. Finalement, la barre d'outils est une fen�tre flottante qui contr�le et ex�cute les commandes de ddd.

En plus de la fen�tre principale, il existe une fen�tre d'ex�cution pour le processus en cours et une autre pour le code source du programme � d�boguer. Les deux sont optionnelles.

ddd est livr� avec de multiples aides qui fournissent � l'utilisateur les informations n�cessaires � tout moment pendant une session de d�bogage. Par exemple, une boite de dialogue appara�t toujours quand le curseur se d�place au dessus d'une variable ou d'un des boutons de l'interface. Cette boite de dialogue donne des informations pertinentes sur l'objet concern�. La partie inf�rieure le la fen�tre principale a aussi la ligne d'�tat ddd qui indique la commande en cours d'ex�cution et son statut. A droite, on trouve un menu contextuel avec toute l'aide disponible. Une aide suppl�mentaire est disponible avec la touche F1 et en s�lectionnant un sujet dans la fen�tre flottante. Enfin, on peut taper dans la console gdb (la partie inf�rieure) la commande "help" pour obtenir une aide g�n�rale sur le d�bogueur ou des informations sp�cifiques sur une de ses commandes.

Par d�faut, l'interface ddd propose une fen�tre principale divis�e en trois. Le menu "Pr�f�rences" permet d'avoir une interface ddd avec trois fen�tres s�par�es � la place.


Figure 2. Aide pour le menu "File"

Commencer par le Bas

La "DDD:Debugger Console" est le bon endroit pour faire nos premiers pas avec le d�bogueur; les utilisateurs exp�riment�s de gdb peuvent facilement manoeuvrer ddd de l�. D'apr�s mon exp�rience, il est utile de surveiller ce qui se passe sur la console du d�bogueur au moment du lancement de commandes par le biais de l'interface graphique. L'option "Commands->Command History" permet de voir la liste des commandes pr�c�dentes dans une fen�tre s�par�e.

Pour en savoir plus sur les possibilit�s et les sp�cificit�s de DDD, il est pr�f�rable de se r�f�rer directement � la documentation originale. Voici tout de m�me comment r�aliser quelques t�ches simples directement depuis le d�bogueur.

T�ches G�n�rales

Le code source d'une session de d�bogage peut �tre charg� depuis la ligne de commande ddd ou au moyen de l'option "File" du menu; le contenu du fichier source appara�t dans l'emplacement correspondant. A partir de ce point, on peut naviguer dans le code source examiner les valeurs et les types des variables, ex�cuter le programme tout en contr�lant son ex�cution...

La sortie du programme peut �tre suivie dans une fen�tre d'ex�cution (Options -> Run in Execution Window ), ou sur la console du debogueur (cette m�thode ne fonctionnera pas si le programme est con�u pour tourner avec Motif ou une autre biblioth�que graphique).

En pla�ant le curseur sur une variable dans le code source, vous verrez sa valeur courante sur la ligne d'�tat de ddd. En appuyant sur le bouton droit de la souris, le menu suivant appara�t:


Ce menu permet d'inspecter la valeur de la variable "fname", dans la fen�tre inf�rieure ("drawing area "), qu'il s'agisse d'une variable r�elle ou seulement d'un pointeur (une variable contenant une adresse m�moire d'une autre variable, pas sa valeur). De plus,"What is" montre la structure ou le type de cette variable; Lookup permet de rechercher d'autres occurrences de cette m�me variable. Finalement Break at et Clear at autorisent la manipulation des points d'arr�t (breakpoints) dont nous allons bri�vement parler.

Un certain nombre d'options sont aussi disponibles dans la barre de boutons sous la zone du code source. Il suffit de taper le nom du param�tre souhait� dans la boite vide de gauche de choisir l'action appropri�e.

Uu point d'arr�t (break-point) laisse le programme s'ex�cuter jusqu'� une ligne donn�e; l'ex�cution s'arr�te alors et l'utilisateur peut inspecter les valeurs de variables jusqu'� ce point, continuer l'ex�cution pas � pas � la main, passer en revue les cheminements (threads).... etc. En g�n�ral, il faut prendre en compte le fait qu'en l'absence de points d'arr�ts dans le programme, celui-ci termine normalement sont ex�cution ou se plante � cause d'un bogue, il est alors trop tard pour d�cider d'une action d'inspection du programme; il est n�cessaire de d�boguer le programme "pendant son ex�cution".

Pour placer un point d'arr�t, proc�der comme suit:

  • Amener le curseur � gauche de la ligne o� il doit �tre plac�, appuyer sur le bouton droit et choisissez Set Breakpoint ou Set Temporary Breakpoint. La diff�rence entre ces deux options r�side dans le fait que le second est effac� apr�s le premier passage, tandis que le premier n'est effac� que par la commande appropri�e (L'auriez vous devin�? :) ).
  • Appuyer sur le bouton "Break at ()" dans la fen�tre du code source.
  • Tapez "break <numero_de_ligne>" dans la console du d�bogueur.
  • Choisissez dans le menu Source->Edit Breakpoints, ceci ouvrira aussi une fen�tre pour le contr�le de cet utilitaire:

Sur la figure, vous pouvez remarquer deux points d'arr�t aux lignes 70 et 71 du code source, le symbole des points d'arr�t parle de lui m�me.

Le menu suivant sert � g�rer les points d'arr�t:

Avec l'option Condition des points d'arr�ts conditionnels peuvent �tre plac�s. Dans ce cas, le programme ne s'arr�tera que si la condition est v�rifi�e au moment o� l'ex�cution atteint la ligne du point d'arr�t. Une autre sorte de condition est Ignore Count , est vraie lorsque la ligne du point d'arr�t est atteinte <n> fois. Par exemple, elle peut �tre utilis�e pour arr�ter le programme apr�s la 15i�me it�ration d'une boucle.
Une fois que le programme s'est arr�t� � un point d'arr�t, on peut inspecter la valeur d'une variable du programme en utilisant les commandes des menus associ�es. Pour m�moire, toutes ces fonctions sont situ�es dans le menu principal (c'est � dire menu Data).
Pour contr�ler l'ex�cution, on utilise la boite de boutons qui lui est d�di�e exclusivement. Elle ses situ�e dans le coin sup�rieur droit de la fen�tre principale.


On distingue parfaitement le parall�le qui existe entre la boite de boutons et la barre de menu.

On peut d�marrer et arr�ter le programme, et si l'on utilise la barre de menu il est possible de fournir certains param�tres au programme au travers d'une boite de dialogue. Step ex�cute les lignes une par une (pas � pas), autrement dit, s'il y a un appel de fonction, le d�bogueur ira au d�but de cette fonction et attendra la commande Step suivante. Par contre, la commande Next ex�cute un appel de fonction comme une seule instruction.

Continue permet de continuer l'ex�cution d'un programme arr�t� apr�s un point d'arr�t. Kill, Interrupt et Abort sont utilis�s pour interrompre l'ex�cution du programme.

La fen�tre d'affichage des donn�es est probablement la caract�ristique la plus int�ressante de cet outil graphique. On y voit graphiquement la structure et le contenu des donn�es ainsi que les d�pendances entre elles. Dans l'exemple suivant: un tableau (Argumentos) et quatre de ses �l�ments.

Cette fen�tre peut afficher une grande vari�t� d'informations, voyez le menu Data->More Status Displays , o� l'on peut configurer tout ce que l'on souhaite voir dans la fen�tre des donn�es. Dans l'exemple pr�c�dent, on peut aussi afficher le contenu des registres du processeur, les biblioth�ques dynamiques n�cessaires et l'�tat d'ex�cution du programme:


Le Mot de la Fin

L'environement ddd peut �tre personnalis� depuis le m�me programme avec le menu Options->Preferences, et aussi par la m�thode classique des ressources des applications Motif (fichier $HOME/.dddinit). La description de toutes les ressources personnalisables et leur utilisation sort du cadre de cet article

Il est fortement conseill� de lire le manuel fournit avec ddd (ddd.ps) et celui du d�bogueur ("Debugging with GDB"). N�anmoins, l'utilisateur un peu curieux apprendra rapidement par lui m�me. Il suffit de d�boguer un code bien connu pour d�couvrir toutes les possibilit�s de d�bogage.

Pour finir, toutes mes excuses si j'ai commis des erreurs dans l'article :)


Traduit par John Perr

Pour en savoir plus:
© 1998 Jose Maria Laveda
Ce site Web est maintenu par Miguel A Sepulveda.