"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 :)
|
|