Pour afficher le contenu de vector std :: vector myVector, tapez simplement GDB:
(gdb)print myVector
Cela produira une sortie similaire à:
$1 = std::vector of length 3, capacity 4={10,20,30}
Pour réaliser ci-dessus, vous devez avoir gdb 7 (je l'ai testé sur gdb 7.01) et une jolie imprimante python. Le processus d'installation de ceux-ci est décrit sur gdb wiki .
De plus, après l'installation ci-dessus, cela fonctionne bien avec l' interface graphique du débogueur Eclipse C ++ (et tout autre IDE utilisant GDB, comme je pense).
Cela fonctionne bien tant que les éléments vectoriels sont directement interprétables. Mais cela n'aide pas si le vecteur contient des pointeurs vers les éléments d'intérêt.
wallyk
Franchement, je ne trouve pas la page wiki de gdb particulièrement lisible, peut-être parce qu'elle est "légèrement" dépassée maintenant? Par exemple, j'avais l'impression que le contenu suggéré de la $HOME/.gdbinitétait nécessaire. Pour le moment, je me retrouve avec aucun fichier de ce type et je gdbmontre correctement le contenu de std::vector. Cependant, puisque pendant mes tentatives de "randonnées", je viens d'installer puis de désinstaller cgdb, et que j'avais déjà libstdc++5installé, je n'ai aucune idée pourquoi la jolie impression n'a pas fonctionné alors qu'elle fonctionne maintenant.
Enrico Maria De Angelis
257
Avec GCC 4.1.2, pour imprimer l'ensemble d'un std :: vector <int> appelé myVector, procédez comme suit:
print*(myVector._M_impl._M_start)@myVector.size()
Pour imprimer uniquement les N premiers éléments, procédez comme suit:
print*(myVector._M_impl._M_start)@N
Explication
Cela dépend probablement fortement de la version de votre compilateur, mais pour GCC 4.1.2, le pointeur vers le tableau interne est:
myVector._M_impl._M_start
Et la commande GDB pour imprimer N éléments d'un tableau commençant au pointeur P est:
print P@N
Ou, sous une forme courte (pour un .gdbinit standard):
Hehe, c'est quelque chose qui m'a dérangé avant, donc je l'ai juste recherché ce matin et je l'ai ajouté comme mémo pour moi (comme Jeff lui-même l'a recommandé).
John Carter
3
Aussi, si vous voulez juste un élément vectoriel particulier, myVector._M_impl._M_start + n (pour le nième élément)
mariner
1
Ne travaille pas pour moi. Cannot evaluate function -- may be inlined
wallyk
1
Pour imprimer un seul élément, par exemple le 2e élément: print (myVector._M_impl._M_start) [2]
jfritz42
2
Pour trouver les noms spéciaux ( _M_impletc.) de votre compilateur sous GDB 7.0+, utilisezprint /r myVector
Eponymous
14
La «surveillance» des conteneurs STL pendant le débogage est quelque peu problématique. Voici 3 solutions différentes que j'ai utilisées dans le passé, aucune n'est parfaite.
1) Utilisez les scripts GDB de http://clith.com/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 d'ensembles.
2) Visual Studio 2005 a un support fantastique pour regarder les conteneurs STL. Cela fonctionne pour les conteneurs imbriqués, mais pour leur implémentation pour STL uniquement et ne fonctionne pas si vous placez un conteneur STL dans un conteneur Boost.
3) Écrivez votre propre fonction (ou méthode) «d'impression» pour l'élément spécifique que vous souhaitez imprimer pendant le débogage et utilisez «appel» dans GDB pour imprimer l'élément. Notez que si votre fonction d'impression n'est appelée nulle part dans le code, g ++ éliminera le code mort et la fonction 'print' ne sera pas trouvée par GDB (vous obtiendrez un message indiquant que la fonction est en ligne). Compilez donc avec -fkeep-inline-functions
define print_vector
if $argc ==2set $elem = $arg0.size()if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n","$arg0", $arg0.size()set $elem = $arg1 -1endprint*($arg0._M_impl._M_start + $elem)@1elseprint*($arg0._M_impl._M_start)@$arg0.size()endend
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Après avoir redémarré gdb (ou sourcing ~ / .gdbinit), affichez l'aide associée comme ceci
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Réponses:
Pour afficher le contenu de vector std :: vector myVector, tapez simplement GDB:
Cela produira une sortie similaire à:
Pour réaliser ci-dessus, vous devez avoir gdb 7 (je l'ai testé sur gdb 7.01) et une jolie imprimante python. Le processus d'installation de ceux-ci est décrit sur gdb wiki .
De plus, après l'installation ci-dessus, cela fonctionne bien avec l' interface graphique du débogueur Eclipse C ++ (et tout autre IDE utilisant GDB, comme je pense).
la source
$HOME/.gdbinit
était nécessaire. Pour le moment, je me retrouve avec aucun fichier de ce type et jegdb
montre correctement le contenu destd::vector
. Cependant, puisque pendant mes tentatives de "randonnées", je viens d'installer puis de désinstallercgdb
, et que j'avais déjàlibstdc++5
installé, je n'ai aucune idée pourquoi la jolie impression n'a pas fonctionné alors qu'elle fonctionne maintenant.Avec GCC 4.1.2, pour imprimer l'ensemble d'un std :: vector <int> appelé myVector, procédez comme suit:
Pour imprimer uniquement les N premiers éléments, procédez comme suit:
Explication
Cela dépend probablement fortement de la version de votre compilateur, mais pour GCC 4.1.2, le pointeur vers le tableau interne est:
Et la commande GDB pour imprimer N éléments d'un tableau commençant au pointeur P est:
Ou, sous une forme courte (pour un .gdbinit standard):
la source
Cannot evaluate function -- may be inlined
_M_impl
etc.) de votre compilateur sous GDB 7.0+, utilisezprint /r myVector
La «surveillance» des conteneurs STL pendant le débogage est quelque peu problématique. Voici 3 solutions différentes que j'ai utilisées dans le passé, aucune n'est parfaite.
1) Utilisez les scripts GDB de http://clith.com/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 d'ensembles.
2) Visual Studio 2005 a un support fantastique pour regarder les conteneurs STL. Cela fonctionne pour les conteneurs imbriqués, mais pour leur implémentation pour STL uniquement et ne fonctionne pas si vous placez un conteneur STL dans un conteneur Boost.
3) Écrivez votre propre fonction (ou méthode) «d'impression» pour l'élément spécifique que vous souhaitez imprimer pendant le débogage et utilisez «appel» dans GDB pour imprimer l'élément. Notez que si votre fonction d'impression n'est appelée nulle part dans le code, g ++ éliminera le code mort et la fonction 'print' ne sera pas trouvée par GDB (vous obtiendrez un message indiquant que la fonction est en ligne). Compilez donc avec -fkeep-inline-functions
la source
mettez ce qui suit dans ~ / .gdbinit
Après avoir redémarré gdb (ou sourcing ~ / .gdbinit), affichez l'aide associée comme ceci
Exemple d'utilisation:
la source
Un peu tard pour la fête, donc surtout un rappel pour moi la prochaine fois que je ferai cette recherche!
J'ai pu utiliser:
pour imprimer 4 éléments (en hexadécimal) à
vec
partir devec[2]
.la source