Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 0d5cd12c82d627a82c59047e1ba7b8a9 > files > 399

howto-html-fr-9.0-0.2mdk.noarch.rpm

<HTML>
<HEAD>
<TITLE>D&eacute;boguer et optimiser</TITLE>
</HEAD>
<BODY>
<H1>5. <A NAME="s5"></A>D&eacute;boguer et optimiser</H1>
<P>
<A HREF="GCC-HOWTO.html#toc5">Contenu de cette section</A></P>

<A NAME="index.58"></A> <H2>5.1 <A NAME="ss5.1"></A> Etude pr&eacute;ventive du code (lint) </H2>

<P> Il n'existe pas de lint qui soit r&eacute;ellement utilisable, tout simplement
parce que la grande majorit&eacute; des d&eacute;veloppeurs sont satisfaits des messages
d'avertissement de gcc. Il est probable que l'option la plus utile est
l'option <CODE>-Wall</CODE> --- qui a pour effet d'afficher tous les
avertissements possibles.</P>
<P>Il existe une version du domaine public du programme lint
que vous pouvez trouver &agrave; l'adresse suivante : 
<A HREF="ftp://larch.lcs.mit.edu/pub/Larch/lclint">ftp://larch.lcs.mit.edu/pub/Larch/lclint</A>
.  Je ne sais pas
ce qu'elle vaut.</P>
<P></P>

<A NAME="index.59"></A> <H2>5.2 <A NAME="ss5.2"></A> D&eacute;boguer </H2>

<A NAME="index.62"></A> <A NAME="index.61"></A> <A NAME="index.60"></A> <H3>Comment rendre d&eacute;bogable un programme ?   </H3>

<P> Vous devez compiler et effectuer l'&eacute;dition de liens avec l'option
<CODE>-g</CODE>, et sans l'option <CODE>-fomit-frame-pointer</CODE>.  
En fait, vous ne devez compiler que les modules que 
vous avez besoin de d&eacute;boguer.</P>
<P></P>
<P> Si vous poss&eacute;dez un syst&egrave;me a.out, les biblioth&egrave;ques dynamiques sont
compil&eacute;es avec l'option <CODE>-fomit-frame-pointer</CODE>,
que gcc ne peut pas g&eacute;rer. Lorsque vous compilez avec l'option 
<CODE>-g</CODE>, alors par d&eacute;faut vous effectuez une &eacute;dition de liens statique, ce
qui permet de r&eacute;soudre le probl&egrave;me.</P>
<P></P>
<P> Si l'&eacute;diteur de liens &eacute;choue avec un message disant qu'il n'arrive
pas &agrave; trouver la biblioth&egrave;que libg.a, c'est que vous ne poss&eacute;dez pas
la biblioth&egrave;que <CODE>/usr/lib/libg.a</CODE>, qui est la biblioth&egrave;que C standard
permettant le d&eacute;bogage. Cette biblioth&egrave;que est fournie dans 
le paquetage des binaires de la libc., ou (dans les nouvelles versions)
vous aurez besoin de r&eacute;cup&eacute;rer le source et de le compiler vous-m&ecirc;me.
Vous n'avez pas r&eacute;ellement besoin de cela en fait, vous pouvez faire
un lien logique vers <CODE>/usr/lib/libc.a</CODE></P>
<P></P>
<A NAME="index.63"></A> <H3>Comment r&eacute;duire la taille des ex&eacute;cutables ? </H3>

<P> Bon nombre de produits GNU sont fournis pour compiler avec l'option
<CODE>-g</CODE>, ce qui g&eacute;n&egrave;re des ex&eacute;cutables d'une taille tr&egrave;s importante (et 
souvent l'&eacute;dition de liens s'effectue d'une mani&egrave;re statique).
Ce n'est pas une id&eacute;e lumineuse...</P>
<P></P>
<P> Si le programme poss&egrave;de le script <CODE>configure</CODE> g&eacute;n&eacute;r&eacute; par
autoconf, vous pouvez modifier les options de d&eacute;bogage en 
effectuant un
<CODE>./configure CFLAGS=</CODE> ou <CODE>./configure CFLAGS=-O2</CODE>.  Sinon,
vous pouvez aller modifier le Makefile. Bien s&ucirc;r, si vous utilisez le format
ELF, l'&eacute;dition de liens sera effectu&eacute;e de mani&egrave;re dynamique m&ecirc;me avec l'option
<CODE>-g</CODE>. Dans ce cas, vous pouvez effectuer un strip sur l'ex&eacute;cutable.</P>
<P></P>
<A NAME="index.64"></A> <H3>Programmes disponibles </H3>

<P> Beaucoup de gens utilisent <B>gdb</B>, que vous pouvez r&eacute;cup&eacute;rer 
sur le site 
<A HREF="ftp://prep.ai.mit.edu/pub/gnu">prep.ai.mit.edu</A>
, 
sous une forme binaire sur 
<A HREF="ftp://tsx-11.mit.edu/pub/linux/packages/GCC">tsx-11</A>
 ou
sur sunsite.  <B>xxgdb</B> est une surcouche X de gdb (c.a.d. que vous
avez besoin de gdb pour utiliser xxgdb). Les sources peuvent &ecirc;tre r&eacute;cup&eacute;r&eacute;s
sur 
<A HREF="ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz">ftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz</A>
</P>
<P>Il existe &eacute;galement le d&eacute;bogueur <B>UPS</B> qui a &eacute;t&eacute; port&eacute; par Rick Sladkey. 
Il fonctionne sous X &eacute;galement, mais &agrave; la diff&eacute;rence d'xxgdb, ce n'est
qu'une surcouche X pour un d&eacute;bogueur en mode en texte. Il poss&egrave;de 
certaines caract&eacute;ristiques tr&egrave;s int&eacute;ressantes et si vous utilisez beaucoup
ce genre d'outils, vous l'essayerez s&ucirc;rement. Les patches ainsi que 
des versions pr&eacute;compil&eacute;es pour Linux peuvent &ecirc;tre trouv&eacute;es sur 
<A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/">ftp://sunsite.unc.edu/pub/Linux/devel/debuggers/</A>
, et les sources
peuvent &ecirc;tre r&eacute;cup&eacute;r&eacute;s sur 
<A HREF="ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z">ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z</A>
.</P>
<P>Un autre outil que vous pouvez trouver utile pour d&eacute;boguer est
" <B>strace</B> " , qui affiche les appels syst&egrave;mes que le processus
lance. Il poss&egrave;de d'autres caract&eacute;ristiques telles que donner les chemins
d'acc&egrave;s o&ugrave; ont &eacute;t&eacute; compil&eacute;s les binaires, donner les temps
pass&eacute;s dans chacun des appels syst&egrave;mes, et il vous permet &eacute;galement de
conna&icirc;tre les r&eacute;sultats des appels. La derni&egrave;re version de strace 
(actuellement la version 3.0.8) peut &ecirc;tre trouv&eacute;e sur 
<A HREF="ftp://ftp.std.com/pub/jrs/">ftp://ftp.std.com/pub/jrs/</A>
.</P>
<P></P>
<H3>Programmes en t&acirc;che de fond (d&eacute;mon) </H3>

<P> Les d&eacute;mons lancent typiquement un <CODE>fork()</CODE> d&egrave;s leur lancement et
terminent donc le p&egrave;re. Cela fait une session de d&eacute;boguage tr&egrave;s courte.</P>
<P></P>
<P> La mani&egrave;re la plus simple de r&eacute;soudre ce probl&egrave;me est de poser
un point d'arr&ecirc;t sur <CODE>fork</CODE>, et
lorsque le programme s'arr&ecirc;te, forcer le retour &agrave; 0.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
(gdb) list 
1       #include &lt;stdio.h&gt;
2
3       main()
4       {
5         if(fork()==0) printf(&quot;child\n&quot;);
6         else printf(&quot;parent\n&quot;);
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(&quot;child\n&quot;);
(gdb) next
Single stepping until exit from function fork, 
which has no line number information.
child
7       }
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P></P>
<H3>Fichiers core</H3>

<P> Lorsque Linux se lance, il n'est g&eacute;n&eacute;ralement pas configur&eacute;
pour produire des fichiers core. Si vous les voulez vous devez utiliser
votre shell pour &ccedil;a en faisant sous csh (ou tcsh) :
<BLOCKQUOTE><CODE>
<PRE>
% limit core unlimited
</PRE>
</CODE></BLOCKQUOTE>

avec sh, bash, zsh, pdksh, utilisez
<BLOCKQUOTE><CODE>
<PRE>
$ ulimit -c unlimited
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P></P>
<P>Si vous voulez pousser le vice &agrave; nommer votre fichier core (par exemple
si vous utilisez un d&eacute;bogueur bogu&eacute;... ce qui est un comble) 
vous pouvez simplement modifier
le noyau. Editez les fichiers <CODE>fs/binfmt_aout.c</CODE> et
<CODE>fs/binfmt_elf.c</CODE> (dans les nouveaux noyaux, vous devrez 
chercher ailleurs) :</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
        memcpy(corefile,&quot;core.&quot;,5);
#if 0
        memcpy(corefile+5,current-&gt;comm,sizeof(current-&gt;comm));
#else
        corefile[4] = '\0';
#endif
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>et changez les <CODE>0</CODE> par des <CODE>1</CODE>.</P>
<P></P>

<H2>5.3 <A NAME="ss5.3"></A> Caract&eacute;ristiques du programme</H2>

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

<HR>
<P>
Chapitre <A HREF="GCC-HOWTO-6.html">suivant</A>,
Chapitre <A HREF="GCC-HOWTO-4.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="GCC-HOWTO.html#toc5">ce chapitre</A>,
 <A HREF="GCC-HOWTO.html#toc">Table des mati&egrave;res</A> g&eacute;n&eacute;rale</P>
<P>
<A HREF="GCC-HOWTO.html">D&eacute;but</A> du document,
 <A HREF="#0"> D&eacute;but de ce chapitre</A></P>
</BODY>
</HTML>