2010-03-22 5 views
13

J'ai utilisé la solution macro, comme il est décrit here. Cependant, il y a une mention sur la façon de les voir sans macros. Je fais référence à la version 7 de GDB et au-dessus.comment afficher le contenu des conteneurs STL en utilisant GDB 7.x

Est-ce que quelqu'un pourrait illustrer comment?

Merci

+0

quelle version numérique de gdb parlez-vous –

+0

7 et ci-dessus. Merci. – vehomzzz

+0

Copie possible de [Comment faire pour imprimer des conteneurs STL dans GDB?] (Https://stackoverflow.com/questions/11606048/how-to-pretty-print-stl-containers-in-gdb) –

Répondre

21

Obtenez les téléspectateurs de python de SVN

svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 

Ajouter ce qui suit à votre ~/.gdbinit

python 
import sys 
sys.path.insert(0, '/path/to/pretty-printers/dir') 
from libstdcxx.v6.printers import register_libstdcxx_printers 
register_libstdcxx_printers (None) 
end 

Alors impression devrait fonctionner:

std::map<int, std::string> the_map; 
the_map[23] = "hello"; 
the_map[1024] = "world"; 

gdb:

(gdb) print the_map 
$1 = std::map with 2 elements = { [23] = "hello", [1024] = "world" } 

Pour revenir à l'ancienne vue utilisation print /r (/r est BRUT).

Voir aussi: http://sourceware.org/gdb/wiki/STLSupport

+0

Et comment réellement l'utiliser dans GDB pour imprimer le contenu? Est-ce que quelque chose doit être réglé. thx – vehomzzz

+0

Une fois que le code de chargement est en .gdbinit, alors l'impression devrait juste fonctionner, pour revenir à l'ancienne vue, vous faites un print/r (/ r est pour raw) (formatage apparemment suce dans les commentaires, mes excuses) std :: map the_map; The_map [23] = "bonjour" ; The_map [1024] = "monde" ; (gdb) print the_map 1 $ = std :: carte avec 2 éléments = { [23] = "bonjour", [1024] = "world" } – McBeth

+1

Envisagez de modifier votre réponse à inclure cette information dans votre commentaire . De cette façon, le formatage ne sera pas nul. – camh

2

Les libstdcxx_printers sont inclus dans les versions récentes de GCC, donc si vous utilisez 4.5 GCC ou tard vous n'avez pas besoin de faire quoi que ce soit, à peu l'impression fonctionne, tout simplement.

(gdb) p v 
$1 = std::vector of length 3, capacity 3 = {std::set with 3 elements = { 
    [0] = 1, [1] = 2, [2] = 3}, std::set with 2 elements = {[0] = 12, 
    [1] = 13}, std::set with 1 elements = {[0] = 23}} 
(gdb) p v[1] 
$2 = std::set with 2 elements = {[0] = 12, [1] = 13} 

Pour désactiver l'utilisation assez d'impression p/r ou print/r pour obtenir une sortie « brute ».

+0

Comment puis-je utiliser GCC pour compiler des programmes C++ pour afficher des conteneurs STL? Merci! – piyukr

+1

@piyukr quelle partie de la réponse n'est pas claire? Vous n'avez rien à faire de spécial. Si vous demandez quelque chose de différent, alors posez une nouvelle question, n'ajoutez pas de commentaire. –

+0

J'ai utilisé g ++ -g test.cpp puis gdb a.out mais je reçois cette sortie à la place .. [Screenshot] (http://imgur.com/a/KVbCa) – piyukr