2010-05-10 13 views
6

di recente ho iniziato ad utilizzare l'eccellente boost :: unordered_map sul mio sistema, ma ha uno svantaggio: non riuscivo a capire come ispezionare il contenuto. Stamparlo su gdb mi dà un table_ e un bucket_, ma non ho trovato dove sono gli articoli. Qualcuno ha un indizio su questo?Abbastanza stampa boost :: unordered_map sul gdb

risposta

10

Per quelli che volevano una stampante, sono riuscito a creare uno. Ecco il codice:

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

lo so Sono un po 'in ritardo, ma come faccio a caricare (e usare) questa bella stampante in GDB? –

+2

Grazie per aver postato questo. Non funziona per le versioni successive (ho testato su 1.58+), ma l'ho preso e aggiornato questa mattina per lavorare con 1,58. Dopo un po 'di tempo di volo più mi contribuire con una richiesta di pull a https://github.com/ruediger/Boost-Pretty-Printer se va bene con voi. –

2

In una tipica implementazione tabella hash, i secchi contengono la testa di una lista collegata che contiene effettivamente i valori corrispondenti a questa particolare hash. Quindi scommetterei su buckets_.

Un'altra opzione: ci sono varie librerie di stampanti graziose per Python per gdb ora, e penso che potresti trovarne una che funzioni con C++ 0x e ispezionare dove cerca i valori.

+0

Certo, ho controllato implementazione gcc TR1 e le strutture sono piuttosto diverse, e una sostituzione non è un bene perché ho trovato implementazione spinta per essere più veloce rispetto alla controparte TR1 – scooterman

Problemi correlati