Je veux examiner le contenu d'un std::vector
dans GDB, comment le faire? Disons que c'est un std::vector<int>
pour des raisons de simplicité.
Réponses
Trop de publicités?Avec GCC 4.1.2, pour imprimer la totalité d'un std::vector<int> appelé myVector, procédez de la manière suivante:
print *(myVector._M_impl._M_start)@myVector.size()
Pour imprimer uniquement les N premiers éléments, faire:
print *(myVector._M_impl._M_start)@N
Explication
C'est probablement fortement dépend de votre version de compilateur, mais pour GCC 4.1.2, le pointeur interne de tableau est:
myVector._M_impl._M_start
Et la commande GDB pour imprimer les N éléments d'un tableau commençant à l'pointeur P est:
print P@N
Ou, dans une forme courte (pour une norme .gdbinit):
p P@N
Pour afficher vecteur std::vector myVector contenu, il suffit de taper dans GDB:
(gdb) print myVector
Ceci va produire un résultat similaire à:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Pour parvenir ci-dessus, vous devez avoir gdb 7 (je l'ai testé sur gdb 7.01) et python imprimeur. Processus d'Installation de ces éléments est décrit sur gdb wiki.
Ce qui est plus, après l'installation ci-dessus, cela fonctionne bien avec Eclipse C++ debugger GUI (et tout autre IDE à l'aide de GDB, comme je le pense).
'Regarder' conteneurs STL pendant le débogage est un peu un problème. Voici 3 solutions différentes que j'ai utilisé dans le passé, aucun d'eux n'est parfait.
1) Utiliser GDB scripts à partir de http://www.stanford.edu/~apn/gdb_stl_utils/ Ces scripts vous permettent d'imprimer le contenu de presque tous les conteneurs STL. Le problème est que cela ne fonctionne pas pour les conteneurs imbriqués comme une pile de jeux.
2) de Visual Studio 2005 est un support fantastique pour regarder des conteneurs STL. Cela fonctionne pour les conteneurs imbriqués, mais c'est pour leur mise en œuvre pour STL seulement et ne fonctionne pas si vous placez un conteneur STL dans un élan de conteneurs.
3) Écrire votre propre "imprimer" de la fonction (ou méthode) de l'élément spécifique que vous souhaitez imprimer pendant le débogage et l'utilisation "appel", tandis que dans GDB pour imprimer l'article. Notez que si votre fonction d'impression n'est pas d'être appelé n'importe où dans le code g++ ne l'élimination du code mort et la "imprimer" de la fonction ne sera pas trouvé par GDB (vous obtiendrez un message indiquant que la fonction est insérée). Compiler avec -fkeep-inline-fonctions