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.
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
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.
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/.
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 }
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
.
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.
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:30