6. Quand de mauvaises choses arrivent à de bonnes gens

Bien sûr, il n'est pas possible de recouvrir tous les types de problèmes, mais je vais souligner certains points de bon sens.

Il y a deux types de problèmes : les aléatoires et les reproductibles. Il est difficile de diagnostiquer ou de corriger des problèmes aléatoires sur lesquels vous n'avez par définition aucun contrôle. Néanmoins, si le problème est reproductible (ex : « cela se produit quand j'appuie deux fois sur la flèche gauche »), alors vous pouvez agir.

6.1. RTFM !

Relis ton fameux manuel. Le « manuel » peut revêtir plusieurs formes. Pour les jeux open source, on peut trouver les fichiers readme (« lisez-moi »). Les jeux commerciaux sont accompagnés d'un manuel imprimé et éventuellement de quelques fichiers readme sur le CD. N'oubliez pas d'explorer le CD de votre jeu pour obtenir des astuces et des conseils utiles.

N'oubliez pas le site web du jeu. Son auteur a probablement déjà eu affaire à maintes reprises à des personnes ayant exactement le même problème que vous, et il pourrait avoir placé des informations spécifiques à ce jeu sur son site web. Un bon exemple : les FAQ en ligne de Loki Software situées sur http://faqs.lokigames.com.

6.2. Recherchez des mises à jour et des correctifs

Si vous jouez à un jeu open source que vous avez compilé, assurez-vous de disposer de la version la plus récente en visitant le site web du jeu. Si votre jeu fait partie d'une distribution, assurez-vous qu'il n'y ait pas de paquet rpm/deb plus à jour pour le jeu.

Les sociétés produisant des jeux commerciaux comme Loki publient des correctifs pour leurs jeux (souvent nombreux, p.ex. pour Myth2™), et certains sont même injouables en leur absence (Heretic2™). Recherchez des correctifs sur le site web du jeu que vous ayez un problème avec le jeu ou pas ; il peut y avoir une mise à jour pour un problème de sécurité dont vous pourriez ne pas avoir eu connaissance.

À propos, Loki propose maintenant un utilitaire qui recherche les logiciels Loki sur votre disque dur et les met à jour automatiquement. Consultez http://updates.lokigames.com.

6.3. Groupes de discussion

Si vous ne savez pas ce que sont les News (Usenet), alors ça vaut la peine de prendre 30 minutes pour vous y frotter. Installez un lecteur de News. Je préfère les outils en console, et j'utilise donc tin, mais slrn est également populaire. Netscape propose également un chouette lecteur de News graphique piloté à la souris.

Par exemple, je peux me promener sur le serveur de News de Loki Software avec tin -g news.lokigames.com. Vous pouvez également spécifier quel serveur de News utiliser grâce à la variable d'environnement $NNTP ou le fichier /etc/nntpserver.

6.4. Recherche sur Google Groupes

Chaque soumission faite sur Usenet est archivée dans la base de données de Google sur http://groups.google.fr. Cette archive était située sur http://www.deja.com, mais a été rachetée par Google. Beaucoup de personnes parlent toujours de « deja ».

Il est presque sûr que quel que soit le problème que vous avez avec Linux, qu'il ait ou pas un rapport avec le jeu, il a déjà été reporté et solutionné sur Usenet, pas une, pas deux, mais de nombreuses fois. Si vous ne comprenez pas la première réponse que vous voyez (ou si elle ne fonctionne pas), essayez l'une des suivantes. Si la page n'est pas dans une langue que vous comprenez, il existe des tas de sites de traduction qui convertiront le texte dans la langue que vous préférez, comme http://www.freetranslation.com et http://translation.lycos.com. Mon navigateur web préféré, Opera™ (disponible sur http://www.opera.com) vous permet d'utiliser le bouton droit de la souris pour sélectionner un extrait de texte, et de cliquer avec le bouton gauche sur la sélection pour le traduire. Très utile quand une recherche sur Google Groupes renvoie une page en allemand qui semble utile et que ma petite amie (qui lit bien l'allemand) n'est pas disponible.

La recherche sur Google Groupes propose une page de recherche élémentaire et avancée. Ne perdez pas de temps avec la recherche simple. La recherche avancée est située sur http://groups.google.com/advanced_group_search.

C'est facile à utiliser. Par exemple, si mon problème est que Quake III™ plante à chaque fois que Lucy saute, j'entre « linux quake3 crash lucy saute » dans la boîte de texte « Retrouver les messages avec tous les mots suivants ».

Certains champs permettent de limiter la portée de votre recherche à un groupe de discussion. Prenez le temps de lire et de comprendre la signification de chaque champ. Je vous le promets : ce service ne vous décevra pas. Utilisez-le, et vous serez quelqu'un de beaucoup plus heureux. Notez bien que les groupes de discussion privés ne sont pas archivés, comme le serveur de News de Loki Software. Néanmoins, vu que beaucoup de personnes utilisent Usenet, cela n'a généralement que peu d'importance.

6.5. Débogage : traces d'appel et fichiers core

Ce n'est généralement pas quelque chose que vous ferez pour les jeux commerciaux. Pour les jeux open source, vous pouvez aider l'auteur en lui fournissant un fichier core ou une trace de la pile. En bref, un fichier core (dit « core dump ») est un fichier qui conserve l'état du programme au moment où il s'est crashé. Il contient des indices précieux pour le programmeur relatifs à la nature du crash : ce qui l'a causé et ce que le programme faisait quand il s'est produit. Si vous voulez en savoir plus sur les fichiers core, j'ai un super tutoriel gdb disponible sur http://www.dirac.org/linux.

En dernier recours, l'auteur sera intéressé par la pile d'appels au moment du plantage du jeu. Voici comment procéder :

Il arrive que les distributions configurent leur système d'exploitation en sorte que les fichiers core (qui sont principalement utiles aux programmeurs) ne sont pas générés. La première étape est d'autoriser votre système à générer des fichiers core de taille illimitée :

    ulimit -c unlimited
      

Vous devrez maintenant recompiler le programme et passer l'option -g à gcc (l'explication dépasse la portée de ce document). À présent, exécutez le jeu et répétez ce qui a fait planter le programme pour générer à nouveau un fichier core. Exécutez le débogueur avec le fichier core comme second argument :

    $ gdb ExécutableJeuChouette core
      

À l'invite, tapez backtrace. Vous verrez quelque chose comme :

    #0 printf (format=0x80484a4 "z is %d.\n") at printf.c:30
    #1 0x8048431 in display (z=5) at try1.c:11
    #2 0x8048406 in main () at try1.c:6
      

Cela peut être assez long, mais utilisez votre souris pour copier et coller ces informations dans un fichier. Envoyez-le par courriel à l'auteur et indiquez-lui :

  1. le nom du jeu

  2. le message d'erreur qui est apparu à l'écran quand le jeu a planté.

  3. ce qui a provoqué le plantage et s'il est reproductible ou non.

  4. la pile d'appels

Si vous avez une bonne bande passante, demandez à l'auteur s'il souhaite le fichier core généré par son programme. S'il est d'accord, envoyez-le lui. N'oubliez pas de lui demander au préalable, car les fichiers core peuvent être très, très gros.

6.6. Parties sauvegardées

Si votre jeu permet de sauvegarder des parties, alors l'envoi à l'auteur d'une copie de la partie sauvegardée est utile car cela lui permet de reproduire le dysfonctionnement. Pour les jeux commerciaux, cette possibilité est plus fructueuse que d'envoyer un fichier core ou une pile d'appels car les jeux commerciaux ne peuvent être recompilés de sorte à inclure des informations de débogage. Vous devriez impérativement demander avant d'envoyer une partie sauvegardée car ils ont tendance à être gros, mais une société comme Loki Software dispose de beaucoup de bande passante. Mike Phillips (un ancien de Loki Software) indique que l'envoi de sauvegardes de jeux à Loki est définitivement une bonne chose.

Évidemment, cela ne s'applique que si votre jeu plante de façon reproductible dans certaines circonstances. Si le jeu vous donne une erreur de segmentation (segmentation fault) à chaque fois que vous l'exécutez, ou est incroyablement lent, une sauvegarde de jeu n'aura que peu d'utilité.

6.7. Que faire quand on ne trouve pas un fichier ou une bibliothèque (ou se faciliter la vie avec strace)

Parfois, vous verrez des messages d'erreur indiquant qu'un fichier n'a pu être trouvé. Le fichier pourrait être une bibliothèque :

    % ./exult 
    ./exult: error while loading shared libraries: libSDL-1.2.so.0: cannot load shared object
    file: No such file or directory
      

ou un fichier de données, comme un fichier wad ou map :

    % qf-client-sdl  
    IP address 192.168.0.2:27001 UDP Initialized Error: W_LoadWadFile: couldn't load gfx.wad
      

Supposez que gfx.wad est déjà sur mon système, mais qu'il ne peut être trouvé étant donné qu'il n'est pas dans le bon répertoire. Mais alors, où est le bon répertoire ? Ne serait-il pas utile de savoir où ces programmes recherchent les fichiers manquants ?

C'est ici que strace brille. Il vous indique quels appels système sont effectués, avec quels arguments, et quelles sont les valeurs de retour. Dans mon « Guide de programmation de modules noyau » (à paraître bientôt sur le LDP), je souligne tout ce que vous devez savoir sur strace. Mais voici les grandes lignes : saisissez la commande

    strace -o ./LS_LOG /bin/ls
      

L'option -o envoie la sortie de strace dans un fichier, ici LS_LOG. Le dernier argument de strace est le programme à surveiller, ici ls. Regardez le contenu de LS_LOG. Assez impressionnant, n'est-ce pas ? Voici une ligne typique :

    open(".", O_RDONLY|O_NONBLOCK|0x18000)  = 4
      

Nous avons utilisé l'appel système open() pour ouvrir « . » avec divers arguments, et la valeur de retour de l'appel est 4. Quel est le rapport avec les fichiers non trouvés ?

Supposez que je veuille regarder la démo de StateOfMind™ car je ne m'en lasse pas. Un jour, j'essaie de l'exécuter et quelque chose se passe mal :

% ./mind.i86_linux.glibc2.1 
Loading & massaging...
Error:Can't open data file 'mind.dat'.

Utilisons strace pour détecter l'endroit où le programme recherchait le fichier de données.

    strace ./mind.i86_linux.glibc2.1 2> ./StateOfMind_LOG
      

Lançant vim et recherchant toutes les occurrences de mind.dat, je trouve les lignes suivantes :

    open("/usr/share/mind.dat",O_RDONLY) = -1 ENOENT (No such file)
    write(2, "Error:", 6Error:)   = 6
    write(2, "Can\'t open data file \'mind.dat\'."..., ) = 33
      

Je ne recherchais mind.dat que dans un seul répertoire. Il apparaît clairement que mind.dat n'est pas dans /usr/share. Nous pouvons maintenant essayer de localiser mind.dat et de le déplacer dans /usr/share ou, mieux, créer un lien symbolique.

Cette méthode fonctionne également pour les bibliothèques. Supposez que la bibliothèque libmp3.so.2 est située dans /usr/local/include mais que votre nouveau jeu Kill-Metallica™ ne le trouve pas. Vous pouvez utiliser strace pour déterminer où Kill-Metallica™ doit rechercher la bibliothèque et créer un lien symbolique de /usr/local/include/libmp3.so.2 vers l'endroit où Kill-Metallica™ recherchait le fichier de bibliothèque.

strace est un utilitaire très puissant. Quand vous essayez de savoir pourquoi quelque chose n'est pas trouvé, il est votre meilleur allié, et est même plus rapide que la consultation du code source. De plus, vous ne pouvez pas rechercher d'informations dans le code source des jeux commerciaux de Lokisoft ou Tribsoft. Mais vous pouvez toujours utiliser strace !

6.8. Consoles corrompues

Parfois, un jeu se termine anormalement et votre console se retrouve alors dans un état bizarroïde : le texte à l'écran est du charabia, votre bel écran noir habituel ressemble à un écran semi-graphique, et cætera. Quand vous tapez sur Entrée, un retour à la ligne n'est pas reproduit à l'écran. Parfois, certaines touches du clavier ne répondent pas. La déconnexion suivie d'une reconnexion ne marche pas toujours, mais il y a d'autres possibilités :

  • Si aucun des caractères que vous tapez n'apparaît à l'écran, les réglages de votre terminal peuvent être incorrects. Essayez « stty echo ». Cela devrait rétablir l'écho des caractères.

  • À l'invite, tapez reset. Cela devrait éliminer beaucoup de problèmes, y compris les consoles corrompues par un jeu basé sur SVGAlib ou ncurses.

  • Essayez de ré-exécuter le même jeu normalement. Une fois, j'ai dû tuer Quake III™ en toute hâte, et j'ai donc effectué un ctrl+alt+backspace. La console était corrompue et présentait un écran quasi-graphique. Exécuter Quake III™ et le quitter normalement a corrigé le problème.

  • Les commandes deallocvt et openvt fonctionneront pour la plupart des autres problèmes. deallocvt N tue entièrement le terminal N, de sorte que Alt-FN ne fonctionne plus du tout. openvt -c N ou openvt -c N le redémarre.

  • Si certaines touches de votre clavier ne fonctionnent pas, faites preuve de créativité. Si vous voulez redémarrer mais que la touche o ne fonctionne pas, essayez d'employer halt. Une méthode que j'ai expérimentée est de taper une commande à l'invite et d'utiliser des caractères à l'écran en utilisant le copier-coller avec la souris. Par exemple, vous pouvez taper ps ax, et vous êtes sûr(e) d'avoir un h, a, l et un t quelque part à l'écran. Vous pouvez utiliser la souris pour copier et coller le mot « halt ».

  • L'option la plus regrettable est le redémarrage. Si c'est possible, un arrêt ordonné est préférable ; utilisez halt ou shutdown. Sinon, utilisez ssh depuis une autre machine. Cela fonctionne parfois quand votre console présente d'importants dysfonctionnements. Dans le pire des cas, appuyez sur le bouton Reset ou Power (réinitialisation ou arrêt de l'alimentation).

Notez que si vous utilisez un système de fichiers journalisé comme ext3, reiserfs ou xfs, l'appui sur le bouton Power n'est pas aussi néfaste que cela. Vous êtes toujours supposé arrêter la machine d'une façon ordonnée, mais l'intégrité du système de fichiers sera préservée. Vous ne verrez normalement pas de fsck pour les partitions qui utilisent le système de fichiers journalisé.

6.9. Système bloqué

Quand un ordinateur se bloque, le clavier et la souris ne répondent plus du tout. C'est une conséquence directe d'un bogue dans le noyau Linux. Bien que Linux soit réputé pour sa stabilité, de telles choses peuvent arriver, en particulier avec les jeux qui occasionnent des événements matériels extrêmement synchronisés se produisant très rapidement, même pour un ordinateur. Quand un ordinateur se bloque, cela peut être un « blocage total », signifiant que le noyau a complètement cessé de fonctionner. Cela indique souvent que le matériel est en cause. Le seul remède à ce type de blocage est d'appuyer sur le bouton Reset ou Power. Le blocage peut également être « léger », à savoir que le noyau fonctionne toujours dans une certaine mesure. Il est possible de se remettre gracieusement de cette situation.

  • La première chose à essayer est de taper control+alt+backspace qui tue X. Si vous récupérez le contrôle sur votre système, le noyau n'était pas réellement bloqué. Si cela ne fonctionne pas après quelques secondes, il faut alors redémarrer le système en suivant les recommandations suivantes :

  • Utilisez control+alt+delete pour redémarrer le système. Vous savez que cela a fonctionné si l'ordinateur émet un bip après quelques secondes (c'est le BIOS qui dit « Tout est OK » au cours du cycle de démarrage).

  • Connectez-vous à partir d'un autre système via ssh. Si vous y parvenez, redémarrez ou arrêtez le système.

  • Si cela n'est pas possible, vous devrez utiliser la « touche magique SysRq » qui est documentée dans /usr/src/linux/Documentation/sysrq.txt. Voici un résumé pour l'architecture x86 (consultez la documentation pour les autres architectures). Notez que si votre clavier n'a pas de touche SysRq, il vous faudra utiliser la touche PrintScreen :

    1. Tapez Alt+SysRq+s pour tenter de synchroniser vos systèmes de fichiers montés afin que les changements apportés aux fichiers soient effectués sur disque. Vous pouvez entendre de l'activité du disque dur. Si vous regardez sur une console, le système devrait afficher le nom des périphériques pour lesquels cette opération a eu lieu.

    2. Quelques secondes plus tard, tapez Alt+SysRq+u pour essayer de remonter les systèmes de fichiers montés en mode lecture seule. Vous devriez entendre de l'activité disque. Si vous examinez une console, le système affichera les périphériques qui ont été remontés.

    3. Après un bref moment, utilisez Alt+SysRq+b pour redémarrer le système.

    4. Vous pouvez aussi taper Alt+SysRq+h pour obtenir un écran d'aide ultra-concis.

Pour prendre en charge la touche magique SysRq, votre noyau doit avoir été compilé à cet effet. Vous trouverez cette option sous « Kernel Hacking | Kernel Debugging | Magic SysRq key ». Si la séquence magique SysRq n'éteint pas correctement votre système, votre noyau s'est réellement bien planté et le seul remède est d'utiliser le bouton Reset ou Power.

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