web-dev-qa-db-fra.com

Comment imprimer les éléments d'un vecteur C ++ dans GDB?

Je veux examiner le contenu d'un std::vector dans GDB, comment puis-je le faire? Disons que c'est un std::vector<int> pour des raisons de simplicité.

199
John Carter

Pour afficher le contenu vectoriel std :: vector myVector, saisissez simplement GDB:

(gdb) print myVector

Cela produira une sortie 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é sur gdb 7.01) et de quelques-uns python pretty-printer. Le processus d’installation de ceux-ci est décrit à la section wiki de gdb .

De plus, après l’installation ci-dessus, cela fonctionne bien avec Eclipse interface graphique du débogueur C++ (et tout autre IDE utilisant GDB , comme je le pense).

72
Michał Oniszczuk

Avec GCC 4.1.2, pour imprimer la totalité 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 .gdbinit standard):

p P@N
249
John Carter

'Regarder' les conteneurs STL pendant le débogage est un problème. Voici 3 solutions différentes que j'ai utilisées dans 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 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 offre un support fantastique pour regarder les conteneurs STL. Cela fonctionne pour les conteneurs imbriqués, mais uniquement pour leur implémentation pour STL 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" 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). Alors compilez avec les fonctions -fkeep-inline

14
Nikhil

mettre 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 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

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'}}
8
badeip