71 votes

Meilleure exploration des variables lors du débogage de code C++ avec Eclipse/CDT

En utilisant Eclipse et CDT pour déboguer du code C++, la variable Windows est encombrante et peu informative pour les types définis dans la bibliothèque template standard ou dans boost (par exemple shared_ptr).

Voici un exemple de ce que cela peut donner pour un std::vector :

bar {…}
    std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
        _M_impl {…} 
            std::allocator<TSample<MyTraits> >  {…} 
            _M_start    0x00007ffff7fb5010  
            _M_finish   0x00007ffff7fd4410  
            _M_end_of_storage   0x00007ffff7fd5010  

Même si ces informations sur les caractéristiques internes de ces types peuvent être utiles, dans la plupart des cas, je m'attendrais à une présentation plus claire, c'est-à-dire une liste de valeurs pour le std::vector. Existe-t-il des outils, des plugins ou d'autres modifications permettant de faire cela ?

EDITAR

Les solutions suivantes ne fonctionnent pas sous linux. J'utilise ubuntu 14.04, eclipse, g++, gdb.

Je ne trouve pas de paquet gdb-python et linux n'utilise pas mingw.

29voto

Trump211 Points 658

Vous avez besoin d'une version de GDB capable d'utiliser python pour imprimer les structures. Je sais qu'au moins sous Windows avec mingw, cela n'est pas fourni dans l'installation par défaut.

Les Pretty Printers sont des modules python qui indiquent à gdb comment afficher une structure donnée. Vous pouvez écrire votre propre module, mais il existe déjà des imprimantes pour STL disponibles au téléchargement.

Pour faire fonctionner les imprimantes Pretty sous Windows (les instructions devraient être similaires pour les autres systèmes d'exploitation) :

Conditions préalables

Installation :

  • Ouvrez un shell de commande et tapez

    mingw-get install gdb-python
  • Lorsque c'est terminé, allez dans un répertoire local et installez les imprimantes en tapant :

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
  • Ouvrez le fichier .gdbinit (créez-le dans un éditeur de texte si nécessaire) et tapez ce qui suit en remplaçant "C:/directory" par le dossier dans lequel vous avez enregistré les imprimantes.

    Python
    import sys
    sys.path.insert(0, 'C:/directory')
    from libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (Aucun)
    fin

Configuration d'Eclipse

  • Allez dans Windows > Préférences > C/C++ > Débogage > GDB
  • A l'endroit où il est indiqué GDB Debugger, mettez le chemin d'accès à la GDB activée en python, qui sera probablement dans le dossier mingw /bin avec un nom comme gdb-python27.exe.
  • À l'endroit où il est indiqué Fichier de commande GDB, indiquez le chemin d'accès au fichier .gdb init que vous avez créé plus tôt.

C'est tout, déboguez comme d'habitude, les structures stl devraient être beaucoup plus faciles à lire.

3 votes

Pouvez-vous donner la solution pour linux.... linux n'a pas mingw, et je ne trouve pas de paquet gdb-python.

0 votes

Après avoir commencé le débogage, je reçois le message d'erreur "Could not determine GDB version using command : gdb-python27.exe --version".

0 votes

Problème résolu en installant la version 32bit de Python au lieu de la version 64bit.

21voto

pedromanoel Points 739

Eh bien, gdb ne supporte pas nativement les conteneurs STL. On ne peut pas dire que ce soit incorrect, puisque cela expose le fonctionnement interne des objets STL, mais la plupart du temps, ce n'est pas ce que nous voulons, n'est-ce pas ?

Si vous utilisez gdb 7.0, vous pouvez profiter des jolies imprimantes. Ce site web http://sourceware.org/gdb/wiki/STLSupport propose un tutoriel assez simple sur la manière de les paramétrer. J'ai copié ci-dessous la partie qui vous intéresse :

  1. Vérifier la dernière imprimante Python libstdc++. machine. Dans un répertoire local, faites :

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
  2. Ajoutez ce qui suit à votre ~/.gdbinit. Le chemin doit correspondre à où se trouve le module python ci-dessus extrait. Ainsi, s'il a été extrait dans : /home/maude/gdb_printers/, le chemin serait celui indiqué dans l'exemple :

        python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end

Le chemin devrait être t qui doit être ajusté dans l ci-dessus. Une fois chargé, le STL que les imprimantes prennent en charge [ ] plus lisible pour l'homme. Pour imprimer les classes dans le fichier ol (raw) dans la commande d'impression (par exemple, print /r foo). Cette commande imprimera les classes comme si la commande Python n'étaient pas chargées.

Puisque vous utilisez eclipse cdt, n'oubliez pas de faire pointer votre configuration de débogage vers votre fichier .gdbinit. Lorsque vous créez une nouvelle configuration de débogage, allez dans l'onglet Débogueur et indiquez le chemin vers le fichier .gdbinit dans le champ "Fichier de commande GDB".

J'espère que cela vous aidera !

9 votes

J'ai suivi les instructions et défini les chemins d'accès corrects, mais cela ne fonctionne pas. Avez-vous des suggestions sur ce qui pourrait ne pas fonctionner ?

2 votes

Cela ne fonctionnait pas non plus pour moi sous Linux. Je l'ai résolu en commentant les lignes from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers(gdb.current_objfile()) dans le fichier libstdcxx/v6/__init__.py.

1 votes

Il fonctionne pour moi sous Linux. Cependant, j'ai dû définir le chemin comme étant /home/user/pathtoprettyprinters alors que ~/pathtoprettyprinters ne fonctionnait pas ! Dans eclipse, j'ai dû mettre le chemin vers .gdbinit sous window->preferences->C/C++->debug->gdb et ensuite recréer ma configuration de lancement de débogage pour le faire fonctionner. Voir aussi ici : stackoverflow.com/questions/4985414/

10voto

0x0000eWan Points 35

Dans la vue de débogage, dans la liste des variables, développez vector :

"vector_name" -> std::_Vector_base<"datatype"> -> _M_impl

puis cliquez avec le bouton droit de la souris sur _M_start et sélectionnez "Afficher sous forme de tableau...", saisissez sa longueur et cliquez sur OK. Vous pouvez maintenant développer chaque élément de votre vecteur.

1 votes

Veillez à développer _M_start après avoir suivi la procédure "Display as array...".

1 votes

C'est une réponse brillante. Je ne sais pas pourquoi elle n'a pas été acceptée.

2 votes

Cela fonctionne pour un vector<T> car il possède un membre sous-jacent de type T[] . Pour les autres types de STL, cela ne fonctionne pas. Il s'agit d'une solution simple et efficace pour les vecteurs et les chaînes de caractères.

8voto

Adri C.S. Points 879

Si vous avez gdb le soutien à CDT (voir, par exemple, GDB dans Eclipse ), vous pouvez essayer ceci : Déréférencement des conteneurs STL

Il y a longtemps, j'ai rencontré le même problème. Vérifier les conteneurs STL était une véritable plaie. Puis j'ai trouvé ce lien et j'ai ajouté à mon .gdbinit classer certaines de ces définitions. La vie a ensuite été plus facile.

NOTE : Mon gdb est la version 7.1 et l'ajout de ces définitions fonctionne correctement. Je ne sais pas si dans les versions plus récentes de gdb ils sont déjà inclus.

5voto

William Symionow Points 276

J'aimerais développer la réponse concernant Windows 7, car certaines étapes clés ont été omises :

Pour les utilisateurs de MinGW avec Eclipse CDT

0) Si vous n'avez pas de GDB python, ouvrez un shell/commande et utilisez MinGW-get.exe pour 'installer'. GDB compatible avec Python, par exemple

   MinGw-get.exe install gdb-python

1a) Obtenez Python 2.7.x à partir de http://python.org/download/ et installer

1b) Assurez-vous que PYTHONPATH et PYTHONHOME sont définis dans votre environnement :

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c) Ajoutez PYTHONHOME à votre PATH

 %PYTHONHOME%;...

2a) Ouvrez une fenêtre de texte et saisissez les affirmations suivantes. Remarquez que la troisième ligne est qui pointe vers l'endroit où se trouvent les scripts. Voir les notes ci-dessous à ce sujet !

python
import sys
sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2b) Enregistrer sous '.gdbinit' NOTE : L'explorateur Windows ne vous permettra pas de nommer un fichier qui commence par avec un point de l'explorateur. La plupart des éditeurs de texte (y compris le Bloc-notes) le permettent. Les fichiers GDB init sont comme des 'scripts' de commandes GDB que GBD exécutera au chargement.

2c) Le fichier '.gdbinit' doit se trouver dans le répertoire de travail de GDB (il s'agit probablement de vos projets). le répertoire racine de votre projet, mais votre IDE peut vous le dire.

3) Ouvrez la boîte de dialogue des préférences d'Eclipse (ou d'un autre IDE). Allez dans le sous-menu Débogueur C++.

4) Configurer Eclipse pour utiliser C:\MinGW\bin\gdb-python27.exe comme débogueur et votre .gdbinit comme fichier de configuration.

5a) Recréez toutes vos configurations de lancement de débogage (supprimez l'ancienne et créez-en une nouvelle à partir de zéro).

--OR--

5b) Editer chaque configuration de débogage et la faire pointer vers le nouveau gdb-python.exe ET la faire pointer vers le fichier .

Si vous rencontrez des problèmes :

--N'oubliez pas de changer l'emplacement du répertoire python dans le code python ci-dessus ! Ce répertoire est créé par MinGW, donc n'y allez pas par quatre chemins. l'a fait pour vous à l'étape zéro. Allez simplement dans le répertoire d'installation de MinGW, le dossier share, le dossier GCC (avec le numéro de version) et vous trouverez le dossier python. C'est à cet endroit que python script chargé par GDB.

--De plus, le .gdbinit est une PITA, assurez-vous que son nom est correct et qu'il se trouve dans le dossier de travail de GDB. qui n'est pas nécessairement celui où se trouve gdb-python.exe ! Regardez votre sortie GDB lors du chargement de GDB pour voir si a) 'python-enabled' apparaît pendant le chargement et si les déclarations dans le .gdbinit apparaissent.

--Enfin, j'ai eu beaucoup de problèmes avec les variables du système. Si python vous donne 'ImportError' alors vous n'avez probablement pas défini PYTHONPATH ou PYTHONHOME.

--Le répertoire contenant 'gdb-python27' (par ex. C:\MinGW\bin ') devrait également se trouver sur votre chemin et si c'est le cas, cela rend la configuration d'Eclipse un peu plus agréable car vous n'avez pas besoin de mettre des chemins absolus. Si cela fonctionne, vous verrez une sortie de gbd (console->gdb traces) comme ceci au démarrage du débogueur :

835,059 4^done
835,059 (gdb) 
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb) 
835,129 13source C:\MinGW\bin\.gdbinit
835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
835,142 13^done
835,142 (gdb)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X