diff options
Diffstat (limited to 'fr_FR.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml')
-rw-r--r-- | fr_FR.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml | 682 |
1 files changed, 0 insertions, 682 deletions
diff --git a/fr_FR.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml b/fr_FR.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml deleted file mode 100644 index b8c33414c3..0000000000 --- a/fr_FR.ISO_8859-1/books/handbook/kerneldebug/chapter.sgml +++ /dev/null @@ -1,682 +0,0 @@ -<!-- - The FreeBSD Documentation Project - The FreeBSD French Documentation Project - - $FreeBSD$ - Original revision: 1.13 ---> - -<chapter id="kerneldebug"> - <title>Déboguer le noyau</title> - - <para><emphasis>Contribution de &a.paul; et &a.joerg;</emphasis></para> - &trans.a.haby; - - <sect1> - <title>Déboguer une trace de - plantage - <foreignphrase>crash - dump</foreignphrase> - avec <command>kgdb</command></title> - - <para>Voici quelques instructions pour déboguer le noyau en cas de - plantage. Elles supposent que vous avez suffisamment d'espace de - pagination pour enregistrer la trace du plantage. Si vous avez plusieurs - partitions de pagination et que la première est trop petite pour - archiver cette trace, vous pouvez configurer votre noyau pour utiliser - un autre fichier spécial de périphérique pour stocker - cette trace (à la ligne <literal>config kernel</literal>) ou vous - pouvez indiquer un autre fichier spécial de - périphérique avec la commande &man.dumpon.8;. La meilleure - méthode pour utiliser &man.dumpon.8; consiste à positionner - la variable <literal>dumpdev</literal> dans - <filename>/etc/rc.conf</filename>. Vous utiliserez typiquement une des - partitions de pagination définies dans - <filename>/etc/fstab</filename>. L'enregistrement de la trace sur d'autres - fichiers spéciaux de périphériques que les partitions - de pagination, des bandes par exemple, n'est actuellement pas - supporté. Configurez votre noyau avec <command>config -g</command>. - Reportez-vous au chapitre <link linkend="kernelconfig">Configuration du - noyau de FreeBSD</link> pour avoir plus de détails sur la - manière de procéder.</para> - - <para>Utilisez la commande &man.dumpon.8; pour dire au noyau où - enregistrer la trace (notez que cela doit être fait après - avoir configuré la partition en question comme partition de - pagination avec &man.swapon.8;). C'est normalement fait via - <filename>/etc/rc.conf</filename> et <filename>/etc/rc</filename>. Vous - pouvez aussi définir le fichier spécial de trace avec la - clause <literal>dump</literal> de la ligne <literal>config</literal> du - fichier de configuration du noyau. C'est déprécié - et ne devrait être utilisé que si vous voulez la trace d'un - plantage du noyau lors du démarrage du système.</para> - - <note> - <para>Dans ce qui suit, le terme <command>kgdb</command> se rapporte - à <command>gdb</command> exécuté en “mode - déboguage du noyau”. Cela se fait soit en lançant - <command>gdb</command> avec l'option <option>-k</option>, soit en - le générant et en le lançant sous le nom - <command>kgdb</command>. Ce n'est cependant pas fait par défaut, - et c'est une façon de faire obsolète, parce que les gens - du projet GNU n'aiment pas que leurs outils se comportent - différemment quand ils sont appelés d'un autre nom. Cette - fonctionnalité pourrait disparaître des versions - futures.</para> - </note> - - <para>Une fois que le noyau a été compilé, faites-en - une copie, disons <filename>kernel.debug</filename>, et exécutez - <command>strip -d</command> sur l'original. Installez l'original comme - d'habitude. Vous pouvez aussi installer le noyau non expurgé, mais - le temps de recherche dans la table des symboles augmentera de - façon dramatique pour certains programmes, et comme le noyau - est intégralement chargé en mémoire au - démarrage et y reste ensuite, vous gaspillerez plusieurs Mo de - mémoire physique.</para> - - <para>Si vous testez un nouveau noyau, par exemple en donnant le nom de ce - noyau au démarrage, mais avez besoin de démarrez avec un - autre noyau pour avoir de nouveau un système en état de - marche, démarrez uniquement en mode mono-utilisateur avec - l'indicateur <option>-s</option> à l'invite de démarrage et - effectuez ensuite les étapes suivantes :</para> - - <screen>&prompt.root; <userinput>fsck -p</userinput> -&prompt.root; <userinput>mount -a -t ufs</userinput> # de façon à ce qu'il soit possible d'écrire - # sur le système de fichiers pour /var/crash -&prompt.root; <userinput>savecore -N /kernel.panicked /var/crash</userinput> -&prompt.root; <userinput>exit</userinput> # ... en mode multi-utilisateur</screen> - - <para>Cela dit à &man.savecore.8; d'utiliser un autre noyau pour y - chercher les noms des symboles. Il utiliserait sans cela le noyau en cours - d'exécution et cela ne ménerait probablement à rien, - puisque les symboles de la trace de plantage et ceux du noyau ne sont pas - les mêmes.</para> - - <para>Maintenant, après un plantage, allez dans - <filename>/sys/compile/QUELQUE_CHOSE</filename> et lancez - <command>kgdb</command>. Sous <command>kgdb</command>, tapez :</para> - - <screen><userinput>symbol-file kernel.debug</userinput> -<userinput>exec-file /var/crash/kernel.0</userinput> -<userinput>core-file /var/crash/vmcore.0</userinput></screen> - - <para>et voilà, vous pouvez maintenant déboguer la trace de - plantage en vous servant des sources du noyau comme vous le feriez pour - n'importe quel autre programme.</para> - - <para>Voici la trace d'une session <command>kgdb</command> qui illustre la - façon de procéder. Les lignes trop longues ont - été scindées pour en faciliter la lecture, et les - lignes sont numérotées pour pouvoir y faire - référence. Malgré cela, c'est un exemple grandeur - nature, correspondant à une trace prise lors du - développement du pilote <devicename>pcvt</devicename>.</para> - -<screen> 1:Script started on Fri Dec 30 23:15:22 1994 - 2:&prompt.root; <userinput>cd /sys/compile/URIAH</userinput> - 3:&prompt.root; <userinput>kgdb kernel /var/crash/vmcore.1</userinput> - 4:Reading symbol data from /usr/src/sys/compile/URIAH/kernel -...done. - 5:IdlePTD 1f3000 - 6:panic: because you said to! - 7:current pcb at 1e3f70 - 8:Reading in symbols for ../../i386/i386/machdep.c...done. - 9:<prompt>(kgdb)</prompt> <userinput>where</userinput> -10:#0 boot (arghowto=256) (../../i386/i386/machdep.c line 767) -11:#1 0xf0115159 in panic () -12:#2 0xf01955bd in diediedie () (../../i386/i386/machdep.c line 698) -13:#3 0xf010185e in db_fncall () -14:#4 0xf0101586 in db_command (-266509132, -266509516, -267381073) -15:#5 0xf0101711 in db_command_loop () -16:#6 0xf01040a0 in db_trap () -17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723) -18:#8 0xf019d2eb in trap_fatal (...) -19:#9 0xf019ce60 in trap_pfault (...) -20:#10 0xf019cb2f in trap (...) -21:#11 0xf01932a1 in exception:calltrap () -22:#12 0xf0191503 in cnopen (...) -23:#13 0xf0132c34 in spec_open () -24:#14 0xf012d014 in vn_open () -25:#15 0xf012a183 in open () -26:#16 0xf019d4eb in syscall (...) -27:<prompt>(kgdb)</prompt> <userinput>up 10</userinput> -28:Reading in symbols for ../../i386/i386/trap.c...done. -29:#10 0xf019cb2f in trap (frame={tf_es = -260440048, tf_ds = 16, tf_\ -30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\ -31:2630396, tf_ebx = -266427884, tf_edx = 12, tf_ecx = -266427884, tf\ -32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\ -33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_esp = 3072, tf_\ -34:ss = -266427884}) (../../i386/i386/trap.c line 283) -35:283 (void) trap_pfault(&frame, FALSE); -36:<prompt>(kgdb)</prompt> <userinput>frame frame->tf_ebp frame->tf_eip</userinput> -37:Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done. -38:#0 0xf01ae729 in pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ -39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403) -40:403 return ((*linesw[tp->t_line].l_open)(dev, tp)); -41:<prompt>(kgdb)</prompt> <userinput>list</userinput> -42:398 -43:399 tp->t_state |= TS_CARR_ON; -44:400 tp->t_cflag |= CLOCAL; /* cannot be a modem (:-) */ -45:401 -46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) -47:403 return ((*linesw[tp->t_line].l_open)(dev, tp)); -48:404 #else -49:405 return ((*linesw[tp->t_line].l_open)(dev, tp, flag)); -50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ -51:407 } -52:<prompt>(kgdb)</prompt> <userinput>print tp</userinput> -53:Reading in symbols for ../../i386/i386/cons.c...done. -54:$1 = (struct tty *) 0x1bae -55:<prompt>(kgdb)</prompt> <userinput>print tp->t_line</userinput> -56:$2 = 1767990816 -57:<prompt>(kgdb)</prompt> <userinput>up</userinput> -58:#1 0xf0191503 in cnopen (dev=0x00000000, flag=3, mode=8192, p=(st\ -59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c line 126) -60: return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); -61:<prompt>(kgdb)</prompt> <userinput>up</userinput> -62:#2 0xf0132c34 in spec_open () -63:<prompt>(kgdb)</prompt> <userinput>up</userinput> -64:#3 0xf012d014 in vn_open () -65:<prompt>(kgdb)</prompt> <userinput>up</userinput> -66:#4 0xf012a183 in open () -67:<prompt>(kgdb)</prompt> <userinput>up</userinput> -68:#5 0xf019d4eb in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =\ -69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf\ -70:_ebx = 7086, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \ -71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \ -72:= -272638456, tf_ss = 39}) (../../i386/i386/trap.c line 673) -73:673 error = (*callp->sy_call)(p, args, rval); -74:<prompt>(kgdb)</prompt> <userinput>up</userinput> -75:Initial frame selected; you cannot go up. -76:<prompt>(kgdb)</prompt> <userinput>quit</userinput> -77:&prompt.root; <userinput>exit</userinput> -78:exit -79: -80:Script done on Fri Dec 30 23:18:04 1994</screen> - <para>Commentaires sur les résultats ci-dessus :</para> - - <variablelist> - <varlistentry> - <term>ligne 6 :</term> - - <listitem> - <para>C'est une trace obtenue depuis DDB (voir plus bas), d'où - le commentaire panique “<foreignphrase>because you said - to!</foreignphrase> - parce que vous l'avez - demandé” - et une assez longue trace de la - pile d'exécution; la raison initiale du passage sous DDB est - néanmoins la détection d'un défaut de - page.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>ligne 20 :</term> - - <listitem> - <para>C'est la position de l'appel à la fonction - <function>trap()</function> dans la pile.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>ligne 36 :</term> - - <listitem> - <para>Impose l'utilisation d'un nouveau contexte de - pile - <foreignphrase>stack frame</foreignphrase>; ce - n'est dorénavant plus nécessaire. Les contextes de - pile sont maintenant censés pointer sur les bonnes adresses, - même en cas de débranchement. (Je n'ai pas de trace - récente de plantage sous la main; mon noyau n'a pas - paniqué depuis un certain temps.) Au vu de la ligne 403 du - code source, il y a de fortes chances pour que soit le pointeur de - “tp” soit erronné soit il y ait - débordement dans le tableau.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>ligne 52 :</term> - - <listitem> - <para>Le pointeur semble suspect, mais il se trouve que l'adresse est - valide.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>ligne 56 :</term> - - <listitem> - <para>Il pointe cependant sur n'importe quoi, nous avons donc - trouvé notre erreur! (Pour ceux qui ne sont pas - familiarisés avec ce code particulier : - <literal>tp->t_line</literal> se rapporte à la gestion de - la liaison - <foreignphrase>line - discipline</foreignphrase> - du périphérique - console, qui doit être un entier assez petit.)</para> - </listitem> - </varlistentry> - </variablelist> - </sect1> - - <sect1> - <title>Déboguer une trace de plantage avec DDD</title> - - <para>Il est aussi possible d'examiner une trace de plantage avec un - débogueur graphique comme <command>ddd</command>. Ajoutez l'option - <option>-k</option> à la ligne de commande de - <command>ddd</command> que vous utiliseriez normalement. Par - exemple :</para> - - <screen>&prompt.root; <userinput>ddd -k /var/crash/kernel.0 /var/crash/vmcore.0</userinput></screen> - - <para>Vous devriez maintenant pouvoir examiner la trace de plantage avec - l'interface graphique de <command>ddd</command>.</para> - </sect1> - - <sect1> - <title>Analyser la trace après plantage</title> - - <para>Que faire si le noyau plante alors que vous ne l'aviez pas - prévu et donc que vous ne l'avez pas compilé avec - <command>config -g</command> ? Tout n'est pas perdu. Ne paniquez - pas !</para> - - <para>Il faut bien sûr que vous autorisiez l'archivage des traces de - plantage. Voyez plus haut quelles options vous devez utiliser pour - cela.</para> - - <para>Allez dans le répertoire de compilation de votre noyau et - éditez la ligne contenant <literal>COPTFLAGS?=-O</literal>. - Ajoutez-y l'option <option>-g</option> (mais ne changez - <emphasis>rien</emphasis> au niveau d'optimisation. Si vous avez - déjà une vague idée de là où se situe - le code fautif (e.g., le pilote <devicename>pcvt</devicename> dans - l'exemple précédent), supprimez tous les fichiers objets - correspondant à ce code. Recompilez le noyau. Du fait de la - modification de la date du <filename>Makefile</filename>, d'autres - objets seront reconstruits, par exemple, <filename>trap.o</filename>. Avec - un peu de chance, l'option supplémentaire <option>-g</option> ne - changera rien au code généré, vous aurez donc un - nouveau noyau dont le code est similaire à celui qui a - planté à l'exception de quelques symboles de - débogage. Vérifiez au moins les tailles des deux noyaux avec - la commande &man.size.1;. Si elles ne correspondent pas, vous devrez - probablement en rester là.</para> - - <para>Examinez maintenant la trace comme décrit plus haut. Il y aura - probablement par endroit des symboles de débogage incomplets, comme - on peut le voir dans la trace de la pile de l'exemple plus haut, où - certaines fonctions sont listées sans numéro de ligne et - liste d'arguments. S'il vous faut plus d'informations, supprimez les - fichiers objets et reprenez la session <command>kgdb</command> - jusqu'à ce que vous en sachiez assez.</para> - - <para>Il n'y a aucune garantie que tout cela marche, mais cela fera - l'affaire dans la plupart des cas.</para> - </sect1> - - <sect1> - <title>Déboguer en ligne le noyau avec DDB</title> - - <para>Tandis que <command>kgdb</command> comme débogueur hors-ligne - procure une interface utilisateur de très haut niveau, il y a - certaines choses qu'il ne peut pas faire. Les principales sont la mise en - place de points d'arrêt et l'exécution pas -à-pas du - code du noyau.</para> - - <para>Si vous devez faire du débogage de bas niveau de votre noyau, - il y a un débogueur de bas niveau appelé DDB. Il permet la - mise en place des points d'arrêt, l'exécution instruction - par instruction des fonctions du noyau, l'examen et la modification - de variables du noyau, etc. Il ne peut cependant pas accéder aux - fichiers source du noyau et n'a accès qu'aux symboles globaux et - statiques et non à la totalité des informations comme - <command>kgdb</command>.</para> - - <para>Pour configurer votre noyau pour y inclure DDB, ajoutez la ligne - d'option :</para> - - <programlisting> -options DDB</programlisting> - - <para>à votre fichier de configuration et recompilez-le. - (Reportez-vous au chapitre <link linkend="kernelconfig">Configurer le - noyau de FreeBSD </link> pour plus de détails sur la configuration - du noyau de FreeBSD.)</para> - - <note> - <para>Si vous avez une ancienne version des blocs de démarrage, les - symboles du débogueur peuvent ne pas être chargés du - tout. Mettez à jour les blocs de démarrage; les versions - récentes chargent automagiquement les symboles de DDB.</para> - </note> - - <para>Une fois que votre noyau incluant DDB s'exécute, il y a - plusieurs façons de passer sous DDB. La première et la plus - immédiate est d'utiliser l'option <option>-d</option> dès le - démarrage; Le noyau démarrera en mode débogage et - passera sous DDB avant même de tester la présence des - périphériques. Vous pouvez donc même déboguer - les fonctions de test et d'attachement des - périphériques.</para> - - <para>Le seconde est d'utiliser une combinaison de touches du clavier, - habituellement - <keycombo><keycap>Ctrl</keycap><keycap>Alt</keycap><keycap>>Esc</keycap></keycombo>. - Avec <devicename>syscons</devicename>, cette combinaison peut être - redéfinie; certaines redéfinitions distribuées du - clavier le font, faites-y donc attention. Il existe une option pour les - consoles série qui permet d'utiliser un <keysym>Break</keysym> sur - la ligne console pour passer sous DDB - (<literal>options BREAK_TO_DEBUGGER</literal> dans le fichier de - configuration du noyau). Ce n'est pas l'option par défaut, parce - qu'il y a de nombreux adaptateurs série qui génèrent - gratuitement un <keysym>Break</keysym>, par exemple, lorsque l'on - débranche le câble.</para> - - <para>Troisièmement, le noyau passe sous DDB lorsqu'une condition - panique intervient, s'il est configuré pour l'utiliser. En - conséquence, il vaut mieux ne pas configurer le noyau pour qu'il - inclue DDB, si la machine n'est pas sous surveillance.</para> - - <para>Les commandes de DDB ressemblent assez à celles de - <command>gdb</command>. La première chose que vous devrez - probablement faire sera de placer un point d'arrêt :</para> - - <screen><userinput>b nom-de-fonction</userinput> -<userinput>b adresse</userinput></screen> - - <para>Par défaut, les nombres sont normalement donnés en - hexadécimal, mais, pour les distinguer des noms de symboles, les - nombres hexadécimaux qui commencent par les lettres - <literal>a-f</literal> doivent être précédés de - <literal>0x</literal> (c'est facultatif pour les autres nombres). On peut - utiliser des expressions simples, par exemple : - <literal>nom-de-fonction + 0x103</literal>.</para> - - <para>Pour reprendre l'exécution interrompue du noyau, tapez - simplement :</para> - - <screen><userinput>c</userinput></screen> - - <para>Pour avoir le trace de la pile d'exécution, tapez :</para> - - <screen><userinput>trace</userinput></screen> - - <note> - <para>Remarquez que quand vous passez sous DDB avec une combinaison de - touches, le noyau traite en fait une interruption, le contenu de la pile - d'exécution ne vous sera alors peut-être pas très - utile.</para> - </note> - - <para>Si vous voulez supprimer un point d'arrêt, servez-vous - de :</para> - - <screen><userinput>del</userinput> -<userinput>del expression-définissant-l'adresse</userinput></screen> - - <para>Le premier exemple sert immédiatement après être - arrivé à un point d'arrêt et supprime ce point - d'arrêt. Le second exemple permet de supprimer n'importe quel point - d'arrêt, mais il faut donner son adresse exacte; on peut l'obtenir - avec :</para> - - <screen><userinput>show b</userinput></screen> - - <para>Pour exécuter pas-à-pas le noyau, essayez :</para> - - <screen><userinput>s</userinput></screen> - - <para>Vous exécuterez ainsi pas-à-pas les fonctions, mais vous - pouvez aussi faire en sorte que DDB aille jusqu'à l'instruction de - retour d'une fonction avec :</para> - - <screen><userinput>n</userinput></screen> - - <note> - <para>Ce n'est pas la même chose que la commande - <command>next</command> de <command>gdb</command>, mais c'est - l'équivalent de la commande <command>finish</command>.</para> - </note> - - <para>Pour consulter le contenu de la mémoire, employez (par - exemple) :</para> - - <screen><userinput>x/wx 0xf0133fe0,40</userinput> -<userinput>x/hd db_symtab_space</userinput> -<userinput>x/bc termbuf,10</userinput> -<userinput>x/s stringbuf</userinput></screen> - - <para>pour accéder à des mots/demi-mots/octets, et pour - afficher des chaînes de valeurs - hexadécimales/décimales/caractères. La valeur - après la virgule est le nombre d'éléments. Pour - afficher les <literal>0x10</literal> éléments suivants, - tapez simplement :</para> - - <screen><userinput>x ,10</userinput></screen> - - <para>De même, utilisez :</para> - - <screen><userinput>x/ia foofunc,10</userinput></screen> - - <para>pour désassembler les <literal>0x10</literal> premières - instructions de <function>foofunc</function>, et les afficher avec leur - déplacement depuis le début de - <function>foofunc</function>.</para> - - <para>Pour modifer le contenu de la mémoire, utilisez la commande - d'écriture :</para> - - <screen><userinput>w/b termbuf 0xa 0xb 0</userinput> -<userinput>w/w 0xf0010030 0 0</userinput></screen> - - <para>Le paramètre de la commande - (<literal>b</literal>/<literal>h</literal>/<literal>w</literal>) - indique la taille de la valeur à écrire, la première - expression qui suit est l'adresse où écrire et la suite est - interprétée comme donnant les valeurs à écrire - en séquence en mémoire.</para> - - <para>Si vous avez besoin de connaître le contenu des registres, - servez-vous de :</para> - - <screen><userinput>show reg</userinput></screen> - - <para>Vous pouvez aussi afficher la valeur d'un seul registre avec, par - exemple :</para> - - <screen><userinput>p $eax</userinput></screen> - - <para>et la modifier avec :</para> - - <screen><userinput>set $eax nouvelle-valeur</userinput></screen> - - <para>Si vous voulez appeler une fonction du noyau depuis DDB, dites - simplement :</para> - - <screen><userinput>call func(arg1, arg2, ...)</userinput></screen> - - <para>La valeur de retour sera affichée.</para> - - <para>Pour avoir un résumé du style &man.ps.1; des processus - lancés, utilisez :</para> - - <screen><userinput>ps</userinput></screen> - - <para>Vous avez maintenant examiné la raison de l'échec de - votre noyau, et voulez redémarrer le système. Rappelez-vous - que, selon la gravité des dysfonctionnements - précédents, toutes les parties du noyau ne fonctionneront - peut-être pas comme prévu. Redémarrez votre - système, avec l'un des moyens suivants :</para> - - <screen><userinput>call diediedie()</userinput></screen> - - <para>Votre noyau enregistrera une trace de plantage et redémarrera, - vous pourrez donc analyser à plus haut niveau la trace avec - <command>kgdb</command>. Cette commande doit habituellement être - suivie d'une instruction <command>continue</command>. Il y a maintenant - un alias pour cela : <command>panic</command>.</para> - - <screen><userinput>call boot(0)</userinput></screen> - - <para>C'est une bonne méthode pour arrêter proprement le - système, exécuter <function>sync()</function> sur tous les - disques et ensuite redémarrer. Tant que le disque et les interfaces - du système de fichier du noyau ne sont pas endommagés, ce - peut être une bonne façon d'arrêter presque proprement - le système.</para> - - <screen><userinput>call cpu_reset()</userinput></screen> - - <para>est la méthode ultime pour se sortir du désastre et - c'est à peu près la même chose que d'appuyer sur le - Bouton Rouge.</para> - - <para>Si vous avez besoin d'un bref résumé des commandes, - tapez simplemement :</para> - - <screen><userinput>help</userinput></screen> - - <para>Il est néanmoins chaudement recommandé d'avoir sous la - main un exemplaire des pages de manuel de &man.ddb.4; lors d'une session - de débogage. Rappelez-vous qu'il peut être difficile de lire - le manuel en ligne tandis que l'on exécute pas-à-pas le - noyau.</para> - </sect1> - - <sect1> - <title>Déboguer en ligne le noyau en utilisant GDB à - distance</title> - - <para>Cette fonctionnalité est supportée depuis FreeBSD 2.2, - et est de fait très élégante.</para> - - <para>GDB supporte déjà depuis longtemps le - <emphasis>débogage à distance</emphasis>. Cela se fait avec - un protocole très simple sur une ligne série. A l'inverse - des autres méthode décrite plus haut, il vous faudra pour - cela deux machines. L'une fournit l'environnement de débogage, y - compris la totalité des sources, et un exemplaire du binaire du - noyau incluant tous les symboles, et l'autre est la machine cible qui - exécute un exemplaire identique du noyau (mais sans les - informations de débogage).</para> - - <para>Vous devrez configurer le noyau en question avec <command>config - -g</command>, inclure <option>DDB</option> à sa configuration, et - le compiler comme d'habitude. Cela donne un binaire assez imposant, du - fait des informations de débogage. Copiez ce noyau sur la machine - cible, supprimez les informations de débogage avec <command>strip - -x</command>, et démarrez avec l'option <option>-d</option>. - Reliez la première ligne série de la machine cible à - n'importe quelle ligne série de la machine de débogage. - Allez maintenant dans le répertoire de compilation du noyau de la - machine de débogage, et lancez <command>gdb</command> :</para> - - <screen>&prompt.user; <userinput>gdb -k kernel</userinput> -GDB is free software and you are welcome to distribute copies of it - under certain conditions; type "show copying" to see the conditions. -There is absolutely no warranty for GDB; type "show warranty" for details. -GDB 4.16 (i386-unknown-freebsd), -Copyright 1996 Free Software Foundation, Inc... -<prompt>(kgdb)</prompt> </screen> - - <para>Initialisez la session de débogage à distance (en - supposant que l'on utilise le premier port série) - avec :</para> - - <screen><prompt>(kgdb)</prompt> <userinput>target remote /dev/cuaa0</userinput></screen> - - <para>Puis, sur la machine cible (celle qui est passée sous DDB avant - même de tester la présence des périphériques), - tapez :</para> - - <screen>Debugger("Boot flags requested debugger") -Stopped at Debugger+0x35: movb $0, edata+0x51bc -<prompt>db></prompt> <userinput>gdb</userinput></screen> - - <para>DDB répondra par :</para> - - <screen>Next trap will enter GDB remote protocol mode</screen> - - <para>Chaque que vous taperez <command>gdb</command>, vous passerez de GDB - à distance à DDB en local et inversement. Pour basculer - immédiatement, tapez simplement <command>s</command> - (<foreignphrase>step</foreignphrase>). Votre GDB hôte aura - maintenant le contrôle du noyau cible :</para> - - <screen>Remote debugging using /dev/cuaa0 -Debugger (msg=0xf01b0383 "Boot flags requested debugger") - at ../../i386/i386/db_interface.c:257 -<prompt>(kgdb)</prompt></screen> - - <para>Vous pouvez faire sous cette session à peu près les - mêmes choses qu'avec n'importe quelle autre session GDB, y compris - accéder intégralement au source, l'exécuter en mode - <foreignphrase>gud</foreignphrase> dans une fenêtre Emacs (ce qui - provoque l'affichage automatique du code source dans une autre - fenêtre Emacs), etc.</para> - - <para>GDB peut aussi être utilisé à distance pour - déboguer des modules du noyau à chargement - dynamique - <foreignphrase>LKM</foreignphrase>. Compilez d'abord - le module avec les symboles de débogage :</para> - - <screen>&prompt.root; <userinput>cd /usr/src/lkm/linux</userinput> -&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen> - - <para>Installez ensuite cette version du module sur la machine cible, - chargez-le et utilisez <command>modstat</command> pour trouver où - il a été chargé :</para> - - <screen>&prompt.root; <userinput>linux</userinput> -&prompt.root; <userinput>modstat</userinput> -Type Id Off Loadaddr Size Info Rev Module Name -EXEC 0 4 f5109000 001c f510f010 1 linux_mod</screen> - - <para>Prenez l'adresse de chargement et ajoutez-y <literal>0x20</literal> - (probablement pour prendre en compte l'en-tête a.out). C'est - l'adresse où le code du module a été relogé. - Utilisez la commande <command>add-symbol-file</command> de GDB pour - informer le débogueur de l'existence du module :</para> - - <screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020</userinput> -add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at -text_addr = 0xf5109020? (y or n) <userinput>y</userinput> -<prompt>(kgdb)</prompt></screen> - - <para>Vous avez maintenant accès à tous les symboles du - module.</para> - </sect1> - - <sect1> - <title>Déboguer un pilote de console</title> - - <para>Comme vous avez besoin d'un pilote de console pour faire tourner DDB, - les choses sont plus compliquées si c'est le pilote de console - lui-même qui a des problèmes. Vous pouvez penser à - utiliser une console série (soit avec des blocs de démarrage - modifiés, soit en utilisant l'option <option>-h</option> à - l'invite <prompt>Boot:</prompt>) et connecter un terminal standard au - premier port série. DDB fonctionne avec n'importe quel pilote de - console configuré, donc bien sûr aussi avec une console - série.</para> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../handbook.sgml" "part" "chapter") - End: ---> - |