60 votes

STL jolies impressions en GDB

J'ai suivi les instructions du wiki GDB pour installer les jolies imprimantes python afin d'afficher les conteneurs STL. Mon ~/.gdbinit ressemble maintenant à ceci:

 python 
import sys 
sys.path.insert(0, '/opt/gdb_prettyprint/python') 
from libstdcxx.v6.printers import register_libstdcxx_printers 
register_libstdcxx_printers (None) 
end 
 

Cependant, lorsque j'exécute GDB et que j'essaie d'imprimer un type STL, j'obtiens les informations suivantes:

 print myString
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.: 
$3 = 
 

Quelqu'un peut-il nous éclairer? J'utilise Ubuntu 12.04, fourni avec GDB 7.4.

10voto

Fei Points 335

Vous pouvez essayer avec la macro GDB ci-dessous (l'ajouter à votre fichier ~ / .gdbinit ) pour imprimer les données des types de conteneur STL et même leurs membres: https://gist.github.com/3978082

5voto

Bingfeng Points 41

Vérifiez votre version de gcc. S'il est inférieur à 4.7, vous devez utiliser un autre fichier printer.py. Extrayez le fichier à l' adresse http://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python/ .

2voto

Manuel Núñez Points 49

Si vous tapez info type _Rep après le Python exception, gdb va vous informer sur les classes chargées qui correspondent à _Rep. Cette liste peut vous aider à trouver pourquoi python ne trouvez pas votre std::string class.

J'ai juste face à votre problème et dans mon cas était intel compilateur c, de la cpi, qui a assez d'impression. En particulier, les non qualifiés de la cpi nom std::string résultats en:

std::basic_string<char, std::char_traits<char>, std::allocator<char> >::std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep;

mais assez de l'imprimante a été à la recherche pour les non qualifiés gcc nom:

std::basic_string<char, std::char_traits<char>, std::allocator<char>::_Rep;

Ce que j'ai fait pour résoudre mon problème était la modification de la classe StdStringPrinter dans printers.py, en ajoutant le nom non qualifié de la chaîne à la propriété typename pour regarder dans gdb. Remplacer la ligne:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()

avec ceci:

reptype = gdb.lookup_type (str (realtype) + '::' + str (realtype) + '::_Rep').pointer ()

Avec la liste d' info type , vous pouvez réparer votre très imprimantes pour les faire travailler.

1voto

Omnifarious Points 25666

Je pense que vous êtes en utilisant un non-GNU bibliothèque STL, ou possible d'un très vieux GCC libstdc++. Le type de la normale STL chaîne sur mon compilateur est: std::basic_string<char, std::char_traits<char>, std::allocator<char> >. Notez que ce n'est pas std::basic_string<char>.

Le code Python a ça:

reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()

Ce regard d'un type imbriqué ::Rep quelle que soit la chaîne de base de type est réellement. Le message d'erreur inidicates que la classe string de quelques étranges de la bibliothèque que vous utilisez n'ont pas réellement un ::Rep imbriquée type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X