2010-05-10 5 views
6

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

10

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" 
+10

Je sais Je suis un peu en retard, mais comment charger (et utiliser) cette jolie imprimante dans GDB? –

+2

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. –

2

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.

+0

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

Questions connexes