Récemment, j'ai commencé à utiliser l'excellent boost :: unordered_map sur mon système, mais j'ai un inconvénient: je n'arrivais pas à comprendre comment inspecter son contenu. L'imprimer sur gdb me donne une table et un buckets, mais je n'ai pas trouvé où sont les items. Quelqu'un a une idée à ce sujet?Jolie impression boost :: unordered_map sur gdb
Répondre
Pour ceux qui voulaient une imprimante, j'ai réussi à en créer un. Voici le code:
class BoostUnorderedMapPrinter:
"prints a boost::unordered_map"
class _iterator:
def __init__ (self, fields):
type_1 = fields.val.type.template_argument(0)
type_2 = fields.val.type.template_argument(1)
self.buckets = fields.val['table_']['buckets_']
self.bucket_count = fields.val['table_']['bucket_count_']
self.current_bucket = 0
pair = "std::pair<%s const, %s>" % (type_1, type_2)
self.pair_pointer = gdb.lookup_type(pair).pointer()
self.base_pointer = gdb.lookup_type("boost::unordered_detail::value_base< %s >" % pair).pointer()
self.node_pointer = gdb.lookup_type("boost::unordered_detail::hash_node<std::allocator< %s >, boost::unordered_detail::ungrouped>" % pair).pointer()
self.node = self.buckets[self.current_bucket]['next_']
def __iter__(self):
return self
def next(self):
while not self.node:
self.current_bucket = self.current_bucket + 1
if self.current_bucket >= self.bucket_count:
raise StopIteration
self.node = self.buckets[self.current_bucket]['next_']
iterator = self.node.cast(self.node_pointer).cast(self.base_pointer).cast(self.pair_pointer).dereference()
self.node = self.node['next_']
return ('%s' % iterator['first'], iterator['second'])
def __init__(self, val):
self.val = val
def children(self):
return self._iterator(self)
def to_string(self):
return "boost::unordered_map"
Dans une implémentation de table de hachage typique, les compartiments contiennent la tête d'une liste liée qui contient en réalité les valeurs correspondant à ce hachage particulier. Ainsi je parierais sur buckets_
.
Une autre option: il existe maintenant de nombreuses bibliothèques d'imprimantes python pour gdb, et je pense que vous pourriez en trouver une qui fonctionne avec C++ 0x et inspecter où elle recherche les valeurs.
Bien sûr, je l'ai vérifié la mise en œuvre de TR1 gcc et les structures sont assez différentes, et remplacer n'est pas bon parce que j'ai trouvé la mise en œuvre de coup de pouce pour être plus rapide que la contrepartie TR1 – scooterman
- 1. boost :: sérialisation de boost :: unordered_map
- 2. boost :: unordered_map maintient l'ordre d'insertion?
- 3. Java: Une jolie impression plus facile?
- 4. jolie impression XML dans les rapports de cristal
- 5. Une jolie impression facile de flotteurs en python?
- 6. Trouver de la valeur dans unordered_map
- 7. Indiquez le nombre minimum de godets lors de la construction d'un boost :: unordered_map
- 8. Comment puis-je utiliser un type personnalisé pour les clés d'un boost :: unordered_map?
- 9. gdb breakpoint sur pthread_create
- 10. Réécrire en "jolie URL"?
- 11. Différence entre hash_map et unordered_map?
- 12. événement Impression sur C#
- 13. gdb dans emacs sur Windows
- 14. asp.net et jQuery (jolie photo)
- 15. Faces Jolie problème de cartographie
- 16. Rails Jolie URL avec décimales
- 17. impression java sur papier - sortie de formatage pour impression
- 18. Utiliser Boost sur Ubuntu
- 19. Boost bibliothèques sur Monodevelop
- 20. Appel d'une fonction boost :: function via boost :: function_base
- 21. C++ unordered_map type défini par l'utilisateur
- 22. Je ne comprends pas std :: tr1 :: unordered_map
- 23. Python - Impression sur stdout sur un "terminal"
- 24. pas pu installer GDB sur Fedora
- 25. Exécution de gdb sur un serveur Web
- 26. gdb incapable de briser sur appel lstat
- 27. Python jolie imprimante XML pour chaîne XML
- 28. Rendre ma vue aussi jolie que NSAlertView
- 29. Les tests Intellisense boost :: boost :: boost :: boost :: boost :: boost :: classname ....... pourquoi?
- 30. Boost sur Unix ... ne peut pas décompressez bibliothèque Boost
Je sais Je suis un peu en retard, mais comment charger (et utiliser) cette jolie imprimante dans GDB? –
Merci de l'avoir posté. Cela ne fonctionne pas pour les versions ultérieures (j'ai testé sur 1.58+), mais je l'ai pris et mis à jour ce matin pour travailler avec 1.58. Après un peu plus de temps de vol, je vais envoyer une demande de retrait à https://github.com/ruediger/Boost-Pretty-Printer si cela vous convient. –