Ubuntu, CMake, gdb, Eclipse et… Doctor Who

#RetirezMoiPhotoshop

#RetirezMoiPhotoshop

J’ai rencontré l’autre jour un problème qui s’est avéré assez compliqué alors que je cherchais à faire un truc simple à la base : je voulais ouvrir un projet de code C++ généré par CMake dans l’éditeur Eclipse et pouvoir le déboguer avec le débogueur inclus dans Eclipse. Sauf que bien sûr ça ne fonctionnait pas…

Et je me suis par la suite rendu compte qu’il ne s’agissait pas seulement d’un problème d’Eclipse mais que tous les logiciels utilisés à côté avaient également, à des degrés divers, leur part de responsabilité. Ou quand les logiciels se liguent pour faire chier au maximum !

Cet article est en rédaction depuis un moment, mais quel meilleur moment qu’aujourd’hui pour le publier puisque s’organise ce Dimanche à Lyon le Doctor Who Day ? Considérons donc qu’il s’agira de ma maigre participation vu qu’exceptionnellement, cet article sera narré (à grand renfort de gifs) par des acteurs de la série Doctor Who.

Bon, déjà que c’est un article au sujet extrêmement technique de base, pas sûr que l’on comprenne encore bien le problème de base ou la solution à y apporter, mais au moins une chose est sûre: cet article sera unique. Et c’était très amusant à écrire.

C’est parti. 🙂

 


 

raining_david_tennant

Christopher, j’ai besoin d’aide ! Le débogueur de mon Eclipse ne fonctionne pas !

nine_dancing_doctor_who

*Tainted love, dum dum dum dudum…* C’est quoi ton problème David ?

DAVID: Je comprends pas, sur mon Ubuntu 14.04 LTS, j’ouvre mon projet dans Eclipse, et au moment de le lancer avec le débogueur (le mode Debug As…), j’obtiens un message d’erreur bizarre :

1
2
3
4
from libstdcxx.v6.printers import register_libstdcxx_printers
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named libstdcxx.v6.printers
not_supposed

Effectivement, c’est bizarre.

CHRISTOPHER: Il semblerait que ça a à voir avec la fonctionnalité de pretty-printing incluse dans GDB sous forme de modules Python. On dirait qu’un module est manquant, il n’arrive pas à le charger !

DAVID: Oui, c’est ce que j’ai compris aussi. J’ai déjà tenté de désactiver cette fonctionnalité dans Eclipse, dans le menu « Window -> Preferences -> C/C++ -> Debug -> GDB » en décochant la case « Enable pretty printers », mais ça continue de le faire !

CHRISTOPHER: Heureusement que tu as de la chance David, je pense avoir une solution ! Je l’ai piquée de cette question Stack Overflow sans réponse, mais aux commentaires intéressants : tu peux te créer un fichier ~/.gdbinit (sur Linux) et y placer la commande « python sys.path.append(« /usr/share/gcc-4.8/python ») », ce qui nous permet de résoudre une sombre histoire de portage d’un script Python en Python 3 qui a soit foiré, soit été oublié, ce qui fait que gdb n’arrive plus à trouver ses précieux scripts de pretty-printing… Et  j’aime autant te dire que sur une distribution Linux comme ta Ubuntu LTS, ce genre de petit problème peut rester en suspens pendant très longtemps.

oh_yes

Super, merci Chris !

DAVID: Un problème en moins à régler, j’envoie la solution à Karen et je fonce à la soirée de Matt, il va encore nous faire le coup de la drunken giraffe, ça va être génial !

Ah. Ok David, à plus tard... (ne pas faire de remarque sur le fait que j'ai pas été invité, ne pas faire de remarque sur le fait que j'ai pas été invité...)

Ah. Ok David, à plus tard… (ne pas faire de remarque sur le fait que j’ai pas été invité, ne pas faire de remarque sur le fait que j’ai pas été invité…)

 


Un peu plus tard…

amy

Hum, excusez-moi…

KAREN: C’est vous qui avez aidé David tout à l’heure ? J’ai tenté de faire ce qu’il m’a dit mais maintenant on a un autre message d’erreur !

nine_dancing_doctor_who

*Tainted love, dum dum dum dudum…*

amy2

Heu, vous écoutez quand on vous parle ou bien ?

CHRISTOPHER: Oups, bien sûr je vous écoute. Ça ne fonctionne toujours pas ?

KAREN: Et non, maintenant nous n’avons plus le problème des pretty printers, mais quand on tente de lancer le projet en Debug dans Eclipse, un gros message d’erreur s’affiche en rouge : « No symbol table is loaded. Use the « file » command. ». D’habitude c’est David qui s’en charge, mais il est parti à une soirée avec des girafes ou je ne sais quoi…

CHRISTOPHER: Oui, c’est ce que j’ai cru comprendre aussi.


Pendant ce temps, à Vera Cruz…

samba drunken_giraffe


KAREN: Mais du coup vous pouvez nous aider ou pas ?

CHRISTOPHER: C’est pas facile, un tel message d’erreur est un peu l’équivalent informatique de la pleurnicherie de bas étage en mode « Ouin, ça marche pas mais c’est pas ma faute, t’as plus qu’à te démerder tout seul, na ! » suivi d’un tirage de langue dédaigneux au possible ! Je peux faire quelques recherches pour voir…


 

Quelques heures plus tard…

amy

Alors, ça donne quoi ?

CHRISTOPHER: Après moult recherches, j’ai fini par tomber sur un post de forum qui m’a mis sur la bonne piste. Votre projet dans Eclipse, c’est un projet généré par CMake ?

KAREN: Ben… Oui !

CHRISTOPHER: Et bien je me suis rappelé que c’est un peu particulier car dans ce genre de cas, contrairement à un projet Eclipse classique, l’IDE ne gère pas la « configuration » du build du projet, à savoir Debug (avec les informations de debug), Release (aucune info de debug, optimisation maximum), etc. Ce rôle revient entièrement à CMake, mais ça, n’ayant pas l’habitude de ce genre de cas de figure, je parie que vous l’aviez oublié…

KAREN: Mais… C’est quoi le rapport ?

CHRISTOPHER: Ben, ça, ça ressemble drôlement à un morceau de message d’erreur qui apparaît quand on essaye de déboguer un programme qui n’a pas d’informations de debug !

KAREN: Vous voulez dire que ce qu’il s’est produit, c’est que je compilais mon projet normalement avec les arguments par défaut de CMake (à savoir, aucun: la commande « cmake » direct), ce qui crée par défaut (dans mon cas, mais c’est configurable) un build… Sans les informations de debug ?

CHRISTOPHER: Exactement ! Et en réalité, Eclipse râle car ce qu’il vous montre, c’est la fin du message d’erreur que lui renvoie GDB. Bien sûr, il se sert de GDB en coulisses pour son propre débogueur, mais il peut ne pas tout montrer quand il y a une erreur, ce qui peut donner quelque chose comme :  » (…partie cachée…) Attention ton binaire n’a pas d’informations de debug ! (…fin de la partie cachée…) il n’y a pas de table des symboles (un mot savant pour désigner des métadonnées sur les composants du programme) » !

KAREN: L’association d’idées n’était pas forcément évidente.

CHRISTOPHER: On peut vite s’assurer du problème en lançant le même programme avec gdb directement en ligne de commande :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
chris@Tardis build $ gdb untitledProjectExe
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
blablabla
j'aime les crêpes
Type "magnifaique ma chérie" to search for commands related to "cristina cordula"...
Find the manual des castors juniors and other documentation resources online at:
<http://www.journaldemickey.com/>.
For help, type "help".
Reading symbols from untitledProjectExe...(no debugging symbols found)...done.
(gdb) break main.cpp:9
No symbol table is loaded. Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) quit

CHRISTOPHER: La partie importante du message n’est pas celle affichée par Eclipse : no debugging symbols found ! Quand on lit ça, le problème devient évident.

KAREN: Il est pas un peu bizarre votre gdb ?…

CHRISTOPHER: Il est… personnalisé. Mais bref, ni une ni deux, vous savez ce qu’il vous reste à faire ?

big_yes

KAREN: À partir de là, c’est facile ! Il suffit de compiler en configuration Debug avec CMake, ce qui se fait facilement avec la syntaxe suivante (on considère qu’on suit la bonne pratique du « out-of-source build », où en gros on a un dossier build duquel on va utiliser le CMakeLIsts.txt resté dans le dossier du dessus, d’où le « .. ») :

cmake -DCMAKE_BUILD_TYPE=Debug ..

KAREN: Et une fois l’exécutable régénéré, je tente à nouveau de l’ouvrir en mode Debug dans Eclipse et là, super ! Ça fonctionne enfin ! Mission accomplie.

CHRISTOPHER: Fantastique !

fantastic thumbsup


Voilà, c’est la fin de cet article qui traitait d’un problème émanant d’une configuration vraiment très spécifique (un problème de pretty printers dans GDB sur une Ubuntu LTS, puis un souci sur les informations de debug d’un projet généré avec CMake débogué sur Eclipse), qui m’aura demandé un certain temps pour être résolu !

Quelques pensées suite à ça :

  • Ubuntu LTS c’est bien quand on veut une distro facile à installer mais c’est vraiment pas l’idéal dès qu’on a besoin de coder un peu avec des outils qui fonctionnent bien
  • CMake n’a vraiment pas un mode de fonctionnement intuitif
  • J’ai redonné sa chance à Eclipse (avec le plugin Eclipse CDT) parce que je m’en étais déjà pas mal servi au Québec pour des projets en C++, mais là, trop c’est trop, je crois que je ne m’en resservirai pas (sans compter sa relative incompatibilité avec CMake qui m’obligerait à avoir une arborescence un peu bizarre…). All hail Qt Creator !
  • Pour le coup, gdb n’a pas grand-chose à se reprocher, lui.

Voilà, cet article est terminé. Bon Doctor Who Day à tous !

 

 

 

 


…Un peu plus tard, alors que Peter tente de réinstaller son Linux…

"Quoi ? "> error: no such device: 58ABF29C...   grub rescue>" ? Oh putain qu'est-ce que c'est que ce bordel encore ?

« Quoi ? « > error: no such device: 58ABF29C…
grub rescue> » ? Oh putain qu’est-ce que c’est que ce bordel encore ? »

PETER: « Christopher !! »

tbc

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.