web-dev-qa-db-fra.com

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

En utilisant Eclipse et CDT pour déboguer du code C++, les fenêtres variables sont lourdes et peu informatives pour les types définis dans la bibliothèque de modèles standard ou dans boost (par exemple shared_ptr).

Juste un exemple à quoi cela peut ressembler 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 éléments internes de ces types peuvent être utiles, dans presque tous les cas, je m'attendrais à une présentation plus claire ici, c'est-à-dire une liste de valeurs pour le vecteur std ::. Existe-t-il des outils, plugins ou autres modifications autour desquels cela peut être fait?

MODIFIER

Les solutions suivantes ne fonctionnent pas pour Linux. J'utilise ubuntu 14.04, Eclipse, g ++, gdb.

Je ne peux pas trouver un paquet gdb-python et linux n'utilise pas mingw

67
Danvil

Vous avez besoin d'une version de GDB capable d'utiliser python pour de jolies structures d'impression. Je sais au moins sur les fenêtres utilisant mingw que cela n'est pas fourni dans l'installation par défaut.

Les jolies imprimantes sont des modules python qui indiquent à gdb comment afficher une structure donnée. Vous pouvez écrire la vôtre, mais il existe déjà des imprimantes pour STL disponibles en téléchargement.

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

Prérequis

Installation:

  • Ouvrez un shell de commande et tapez:

    mingw-get install gdb-python
    
  • Une fois son cd terminé 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 .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 archivé les imprimantes.

    Python
    import sys
    sys.path.insert (0, 'C:/répertoire')
    de libstdcxx.v6.printers importent register_libstdcxx_printers
    register_libstdcxx_printers (Aucun)
    fin

Configuration Eclipse

  • Allez dans Windows> Préférences> C/C++> Débogage> GDB
  • Où il est dit que le débogueur GDB a mis le chemin vers le GDB python activé), il sera très probablement dans le dossier mingw/bin avec un nom comme gdb-python27.exe
  • Là où il est dit GDB Command File, placez le chemin du fichier d'initialisation .gdb que vous avez créé plus tôt.

Voilà, déboguer comme d'habitude, les structures stl devraient être beaucoup plus faciles à lire.

27
DanChianucci

Eh bien, gdb ne prend pas en charge nativement les conteneurs STL. Vous ne pouvez pas dire que c'est incorrect, car cela exposera le fonctionnement interne des objets STL, mais la plupart du temps ce n'est pas ce que nous voulons, non?

Si vous utilisez gdb 7.0, vous pouvez profiter des jolies imprimantes. Ce site Web http://sourceware.org/gdb/wiki/STLSupport a un tutoriel assez simple sur la façon de les configurer. J'ai copié ci-dessous la partie qui vous intéresse:

  1. Récupérez les dernières imprimantes Python libstdc ++ à un emplacement sur votre 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 à l'endroit où le module python ci-dessus a été extrait. Donc, s'il est extrait vers:/home/maude/gdb_printers /, le chemin serait comme écrit 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 doit être le seul élément à ajuster dans l'exemple ci-dessus. Une fois chargées, les classes STL prises en charge par les imprimantes doivent être imprimées dans un format plus lisible par l'homme. Pour imprimer les classes dans l'ancien style, utilisez le commutateur/r (raw) dans la commande print (c'est-à-dire print/r foo). Cela imprimera les classes comme si les jolies imprimantes Python n'étaient pas chargées.

Puisque vous utilisez Eclipse cdt, n'oubliez pas de pointer votre configuration de débogage vers votre fichier .gdbinit. Lors de la création d'une nouvelle configuration de débogage, accédez à l'onglet Débogueur et mettez le chemin d'accès au fichier .gdbinit dans le champ "Fichier de commande GDB".

J'espère que ça aide!

21
pedromanoel

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

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

puis faites un clic droit sur _M_start et sélectionnez "Afficher en tant que tableau ...", saisissez sa longueur, puis cliquez sur OK. Vous pouvez maintenant développer chaque élément de votre vecteur.

10
0x0000eWan

Si vous avez gdb support pour CDT (voir, par exemple, GDB dans Eclipse ), vous pouvez essayer ceci: Déréférencer les conteneurs STL

Il y a longtemps, je suis également tombé sur votre même problème. C'était pénible de vérifier les conteneurs STL. Ensuite, j'ai trouvé ce lien et ajouté à mon .gdbinit fichier certaines de ces définitions. La vie était plus facile après ça.

REMARQUE: Ma version gdb est 7.1 et l'ajout de ces définitions fonctionne correctement. Je ne sais pas si dans les nouvelles versions de gdb elles sont déjà incluses.

8
Adri C.S.

Je voudrais développer la réponse de Windows 7 car certaines étapes clés sont omises:

Ceci est pour les utilisateurs de MinGW avec Eclipse CDT

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

   MinGw-get.exe install gdb-python

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

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 CHEMIN

 %PYTHONHOME%;...

2a) Ouvrez un texte, entrez les instructions suivantes. Remarquez que la 3e ligne pointe vers où se trouvent les scripts python. 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' REMARQUE: Windows Explorer ne vous permettra pas de nommer un fichier commençant par un point de l'Explorateur. La plupart des modifications de texte (y compris le Bloc-notes) vous le permettent. Les fichiers d'initialisation GDB sont comme des "scripts" de commandes GDB que GBD exécutera lors du chargement.

2c) Le fichier '.gdbinit' doit être dans le répertoire de travail de GDB (très probablement c'est le répertoire racine de vos projets mais votre IDE peut vous le dire).

3) Ouvrez votre boîte de dialogue Préférences Eclipse (ou autre IDE). Accédez au sous-menu C++ Debugger.

4) Configurez 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 une nouvelle à partir de zéro).

--OR--

5b) Modifiez chaque configuration de débogage et pointez-la vers le nouveau gdb-python.exe ET pointez-la vers le.

Si vous rencontrez des problèmes:

--N'oubliez pas de changer l'emplacement dans le répertoire python dans le code python! Ce répertoire est créé par MinGW, alors n'allez pas cherchant à télécharger les jolies imprimantes, MinGW l'a fait pour vous à l'étape zéro. Allez simplement dans votre directeur d'installation MinGW, le dossier de partage, le dossier GCC (a le numéro de version) et vous trouverez python Cet emplacement est ce qui devrait être dans le script python chargé par GDB.

- De plus, le .gdbinit est un PITA, assurez-vous qu'il est nommé correctement et dans le dossier de travail de GDB qui n'est pas nécessairement 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 que les instructions dans le .gdbinit apparaissent.

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

- Le répertoire avec 'gdb-python27' (par exemple C:\MinGW\bin ') devrait également être 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 . Mais quand même, le .gbdinit a parfois besoin d'un chemin absoulte. si cela fonctionne, vous verrez la sortie de gbd (traces console-> gdb) 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) 
5
William Symionow

Je sais que JDT (environnement Java dans Eclipse) fournit des "formateurs" personnalisés à appliquer lors de l'affichage des valeurs variables dans les vues de débogage. Un rapide coup d'œil à google pour le même dans CDT apporte cette page:

http://wiki.Eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

Je ne sais pas si cela a encore été intégré dans la ligne principale du CDT, peut-être pouvez-vous essayer de cliquer avec le bouton droit sur une variable pendant le débogage (dans le dernier CDT) et voir s'il y a une entrée de formateur personnalisé. S'il n'est pas disponible, je vous recommande d'ajouter une nouvelle entrée de tracker dans le tracker CDT pour demander cette amélioration.

2
Manuel Selva