recientemente Empecé a utilizar el excelente boost :: unordered_map en mi sistema, pero tengo un inconveniente: no pude entender cómo inspeccionar su contenido. Imprimirlo en gdb me da table_ y a buckets_, pero no he encontrado dónde están los artículos. Alguien tiene una pista sobre esto?Bonito aumento de impresión :: unordered_map en gdb
Respuesta
Para los que querían una impresora, he logrado crear una. Aquí es Código:
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"
En una implementación de tabla hash típica, los depósitos contienen el encabezado de una lista vinculada que en realidad contiene los valores correspondientes a este hash en particular. Por lo tanto, apostaría por buckets_
.
Otra opción: ahora hay varias bibliotecas de impresoras lindas de python para gdb, y creo que podría encontrar una que funcione con C++ 0x e inspeccionar dónde busca los valores.
Claro, yo he comprobado aplicación gcc TR1 y las estructuras son bastante diferentes, y una sustitución no es bueno porque he encontrado aplicación impulso a ser más rápido que la contraparte TR1 – scooterman
- 1. Linux C: volcado fácil/'bonito'/impresión de estructuras (como en gdb) - ¿del código fuente?
- 2. Cadena de impresión apuntada desde Registrarse en GDB
- 3. Pregunta de GDB: ¿impresión bonita de una matriz 2D?
- 4. Encontrar valor en unordered_map
- 5. iteradores bidireccionales en unordered_map?
- 6. gdb impresión bonita con llamadas a funciones directas
- 7. Manteniendo mi PHP bonito
- 8. ¿Cómo se escribe bonito?
- 9. ¿Cómo hacer "redondeo bonito"?
- 10. TimeSpan formato de "tiempo bonito" en C#
- 11. bonito imprimir en un archivo en ruby
- 12. Bonito formato sql en código .NET, ¿rendimiento?
- 13. Bonito imprimir un método en ASM Bytecode
- 14. unordered_map thread safety
- 15. Boost.Intrusive y unordered_map
- 16. std :: unordered_map initialization
- 17. Aumento de tipos en JavaScript
- 18. Eficiencia de iteradores en unordered_map (C++)
- 19. Precategoría de depósitos en C++ unordered_map
- 20. Usando unordered_map de C++ 0x
- 21. Impresión bonita de archivos XML en Emacs
- 22. Aumento de Regex Efficiency
- 23. Textarea Aumento de altura
- 24. En el estándar C++ 0x habrá unordered_map, ¿cómo se compara esto con boosts unordered_map?
- 25. std :: mapa y std :: unordered_map
- 26. gdb con ensamblador: estado de impresión de la marca de transporte
- 27. boost :: serialization of boost :: unordered_map
- 28. Diferencia entre hash_map y unordered_map?
- 29. en torno al aumento IndexError
- 30. Arreglo de mes en JavaScript No muy bonito
que sé Estoy un poco retrasado, pero ¿cómo puedo cargar (y usar) esta bonita impresora en GDB? –
Gracias por publicar esto. No funciona para versiones posteriores (he probado en 1.58+), pero lo tomé y lo actualicé esta mañana para trabajar con 1.58. Después de un poco más de tiempo de vuelo contribuiré con una solicitud de extracción a https://github.com/ruediger/Boost-Pretty-Printer si te parece bien. –