Comment imprimer les éléments d'un vecteur C ++ dans GDB?
Question
Je souhaite examiner le contenu d'un std::vector
dans GDB, comment procéder? Disons que c'est un std::vector<int>
souci de simplicité.
La solution
Pour afficher le contenu vectoriel std :: vector myVector, saisissez simplement GDB:
(gdb) print myVector
Ceci produira un résultat similaire à:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Pour réaliser ce qui précède, vous devez disposer de gdb 7 (je l’ai testé sous gdb 7.01) et de quelques jolies imprimantes en python. Le processus d’installation de ces derniers est décrit dans le wiki de gdb .
De plus, après l'installation ci-dessus, cela fonctionne bien avec l'interface graphique du débogueur C ++ Eclipse (et tout autre IDE utilisant GDB, selon moi).
Autres conseils
Avec GCC 4.1.2, 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 beaucoup de votre version du compilateur, mais pour GCC 4.1.2, le pointeur sur le tableau interne est:
myVector._M_impl._M_start
Et la commande GDB pour imprimer N éléments d’un tableau à partir du pointeur P est:
print P@N
Ou, sous une forme abrégée (pour un fichier .gdbinit standard):
p P@N
"Surveiller" les conteneurs STL lors du débogage est un peu problématique. Voici 3 solutions différentes que j'ai utilisées par le passé, aucune d'entre elles n'est parfaite.
1) Utilisez les scripts GDB de http://clith.com/gdb_stl_utils/ . Ces scripts vous permettent de: 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 offre un support fantastique pour l'observation des conteneurs STL. Cela fonctionne pour les conteneurs imbriqués, mais uniquement pour leur implémentation pour STL et ne fonctionne pas si vous mettez 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 lors du débogage et utilisez "appel" pendant que vous utilisez 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 que la fonction "print" ne sera pas trouvée par GDB (vous recevrez un message indiquant que la fonction est en ligne). Donc, compilez avec -fkeep-inline-functions
mettez ce qui suit dans ~ / .gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
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 source ~ / .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
Exemple d'utilisation:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}