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

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

190
demandé sur John Carter 2008-10-31 13:33:14

4 réponses

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 Eclipse GUI du débogueur C++ (et tout autre IDE utilisant GDB, comme je le pense).

70
répondu Michał Oniszczuk 2010-01-23 13:23:51

Avec GCC 4.1.2, pour imprimer l'ensemble d'un std:: vector 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 forme abrégée (pour une norme .gdbinit):

p P@N
240
répondu John Carter 2011-12-03 18:53:17

'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) Utiliser 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 de jeux.

2) Visual Studio 2005 a un support fantastique pour regarder les conteneurs STL. Cela fonctionne pour imbriqué conteneurs mais ceci est pour leur implémentation pour STL seulement et ne fonctionne pas si vous mettez un conteneur STL dans un conteneur Boost.

3) écrivez votre propre fonction' print '(ou méthode) pour l'élément spécifique que vous souhaitez imprimer pendant le débogage et utilisez 'call' dans GDB pour imprimer l'élément. Notez que si votre fonction d'impression n'est appelée nulle part dans le code, g++ fera l'élimination du code mort et la fonction' print ' ne sera pas trouvée par GDB (vous obtiendrez un message disant que le la fonction est insérée). Compilez donc avec-fkeep-inline-functions

14
répondu Nikhil 2015-01-04 15:25:01

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 sourcing ~/.gdbinit), affiche 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
répondu badeip 2014-08-26 06:57:03