Page suivantePage pr�c�denteTable des mati�res

5. D�boguer et optimiser

5.1 Etude pr�ventive du code (lint)

Il n'existe pas de lint qui soit r�ellement utilisable, tout simplement parce que la grande majorit� des d�veloppeurs sont satisfaits des messages d'avertissement de gcc. Il est probable que l'option la plus utile est l'option -Wall --- qui a pour effet d'afficher tous les avertissements possibles.

Il existe une version du domaine public du programme lint que vous pouvez trouver � l'adresse suivante : ftp://larch.lcs.mit.edu/pub/Larch/lclint. Je ne sais pas ce qu'elle vaut.

5.2 D�boguer

Comment rendre d�bogable un programme ?

Vous devez compiler et effectuer l'�dition de liens avec l'option -g, et sans l'option -fomit-frame-pointer. En fait, vous ne devez compiler que les modules que vous avez besoin de d�boguer.

Si vous poss�dez un syst�me a.out, les biblioth�ques dynamiques sont compil�es avec l'option -fomit-frame-pointer, que gcc ne peut pas g�rer. Lorsque vous compilez avec l'option -g, alors par d�faut vous effectuez une �dition de liens statique, ce qui permet de r�soudre le probl�me.

Si l'�diteur de liens �choue avec un message disant qu'il n'arrive pas � trouver la biblioth�que libg.a, c'est que vous ne poss�dez pas la biblioth�que /usr/lib/libg.a, qui est la biblioth�que C standard permettant le d�bogage. Cette biblioth�que est fournie dans le paquetage des binaires de la libc., ou (dans les nouvelles versions) vous aurez besoin de r�cup�rer le source et de le compiler vous-m�me. Vous n'avez pas r�ellement besoin de cela en fait, vous pouvez faire un lien logique vers /usr/lib/libc.a

Comment r�duire la taille des ex�cutables ?

Bon nombre de produits GNU sont fournis pour compiler avec l'option -g, ce qui g�n�re des ex�cutables d'une taille tr�s importante (et souvent l'�dition de liens s'effectue d'une mani�re statique). Ce n'est pas une id�e lumineuse...

Si le programme poss�de le script configure g�n�r� par autoconf, vous pouvez modifier les options de d�bogage en effectuant un ./configure CFLAGS= ou ./configure CFLAGS=-O2. Sinon, vous pouvez aller modifier le Makefile. Bien s�r, si vous utilisez le format ELF, l'�dition de liens sera effectu�e de mani�re dynamique m�me avec l'option -g. Dans ce cas, vous pouvez effectuer un strip sur l'ex�cutable.

Programmes disponibles

Beaucoup de gens utilisent gdb, que vous pouvez r�cup�rer sur le site prep.ai.mit.edu, sous une forme binaire sur tsx-11 ou sur sunsite. xxgdb est une surcouche X de gdb (c.a.d. que vous avez besoin de gdb pour utiliser xxgdb). Les sources peuvent �tre r�cup�r�s sur ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz

Il existe �galement le d�bogueur UPS qui a �t� port� par Rick Sladkey. Il fonctionne sous X �galement, mais � la diff�rence d'xxgdb, ce n'est qu'une surcouche X pour un d�bogueur en mode en texte. Il poss�de certaines caract�ristiques tr�s int�ressantes et si vous utilisez beaucoup ce genre d'outils, vous l'essayerez s�rement. Les patches ainsi que des versions pr�compil�es pour Linux peuvent �tre trouv�es sur ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/, et les sources peuvent �tre r�cup�r�s sur ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z.

Un autre outil que vous pouvez trouver utile pour d�boguer est � strace � , qui affiche les appels syst�mes que le processus lance. Il poss�de d'autres caract�ristiques telles que donner les chemins d'acc�s o� ont �t� compil�s les binaires, donner les temps pass�s dans chacun des appels syst�mes, et il vous permet �galement de conna�tre les r�sultats des appels. La derni�re version de strace (actuellement la version 3.0.8) peut �tre trouv�e sur ftp://ftp.std.com/pub/jrs/.

Programmes en t�che de fond (d�mon)

Les d�mons lancent typiquement un fork() d�s leur lancement et terminent donc le p�re. Cela fait une session de d�boguage tr�s courte.

La mani�re la plus simple de r�soudre ce probl�me est de poser un point d'arr�t sur fork, et lorsque le programme s'arr�te, forcer le retour � 0.

(gdb) list
1       #include <stdio.h>
2
3       main()
4       {
5         if(fork()==0) printf("child\n");
6         else printf("parent\n");
7       }
(gdb) break fork
Breakpoint 1 at 0x80003b8
(gdb) run
Starting program: /home/dan/src/hello/./fork
Breakpoint 1 at 0x400177c4
Breakpoint 1, 0x400177c4 in fork ()
(gdb) return 0
Make selected stack frame return now? (y or n) y
#0  0x80004a8 in main ()
 at fork.c:5
5         if(fork()==0) printf("child\n");
(gdb) next
Single stepping until exit from function fork,
which has no line number information.
child
7       }

Fichiers core

Lorsque Linux se lance, il n'est g�n�ralement pas configur� pour produire des fichiers core. Si vous les voulez vous devez utiliser votre shell pour �a en faisant sous csh (ou tcsh) :

% limit core unlimited
avec sh, bash, zsh, pdksh, utilisez
$ ulimit -c unlimited

Si vous voulez pousser le vice � nommer votre fichier core (par exemple si vous utilisez un d�bogueur bogu�... ce qui est un comble) vous pouvez simplement modifier le noyau. Editez les fichiers fs/binfmt_aout.c et fs/binfmt_elf.c (dans les nouveaux noyaux, vous devrez chercher ailleurs) :

 memcpy(corefile,"core.",5);
#if 0
 memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
 corefile[4] = '\0';
#endif

et changez les 0 par des 1.

5.3 Caract�ristiques du programme

Il est possible d'examiner un peu le programme pour savoir quels sont les appels de fonctions qui sont effectu�s le plus souvent ou bien qui prennent du temps. C'est une bonne mani�re d'optimiser le code en d�terminant l� o� l'on passe le plus de temps. Vous devez compiler tous les objets avec l'option -p, et pour mettre en forme la sortie �cran, vous aurez besoin du programme gprof (situ� dans les binutils). Consultez les pages de manuel gprof pour plus de d�tails.


Page suivantePage pr�c�denteTable des mati�res

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:30