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
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"
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.
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
- 1. Ubuntu 14.04, gcc 4.8.4: gdb abbastanza la stampa non funziona a causa del problema di Python
- 2. jTidy tag abbastanza stampa personalizzato HTML
- 3. Java abbastanza stampa per la durata
- 4. iteratori bidirezionali in unordered_map?
- 5. Perché C++ 11/Boost `unordered_map` non rihash durante la cancellazione?
- 6. Stampa graziosa STL con GDB e Clang
- 7. Stampa di più variabili in GDB?
- 8. JSON abbastanza in stampa con colore ASCII in pitone
- 9. Esaminare shared_ptr spinta con gdb
- 10. Stampa python os.urandom sul terminale
- 11. Debug delle best practice per C++ STL/Boost con gdb
- 12. struct come chiave di unordered_map
- 13. boost :: formato e stampa personalizzata di contenitori std
- 14. Come si stampa una costante definita # in GDB?
- 15. Stampa di più variabili con un solo comando in GDB
- 16. stampa gdb non stamperà qualcosa leggibile dal mio array CA
- 17. Stampa il nome `errno` invece del valore in GDB
- 18. Come si stampa un array Java in gdb?
- 19. boost :: program_options si blocca sul braccio "a volte"
- 20. Un iteratore itera su boost :: unordered_set o boost :: unordered_map nello stesso ordine fintanto che il set è invariato?
- 21. lettura da unordered_map const
- 22. C++ - complessità unordered_map
- 23. C++ std :: complessità unordered_map
- 24. Stampa il xml generato dall'albero delle proprietà boost
- 25. boost pool_alloc
- 26. Valore hash per una std :: unordered_map
- 27. Accesso alle informazioni sul programma che gdb vede in C++
- 28. Spostamento di tasti da unordered_map
- 29. Abbastanza stampato nella shell MongoDB come predefinito
- 30. boost :: bimap per enum
lo so Sono un po 'in ritardo, ma come faccio a caricare (e usare) questa bella stampante in GDB? –
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. –