ostatnio zacząłem używać doskonałego boost :: unordered_map na moim systemie, ale mam jedną wadę: nie mogłem wymyślić jak sprawdzić zawartość. Drukowanie go na gdb daje mi table_ i buckets_, ale nie znalazłem tam, gdzie są przedmioty. Ktoś ma o tym zielonego pojęcia?Bardzo dobre drukowanie :: unordered_map na gdb
Odpowiedz
Dla tych, którzy chcieli drukarki, udało mi się ją stworzyć. Oto kod:
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"
W typowej implementacji tablicy mieszania, segmenty zawierają nagłówek połączonej listy, która faktycznie zawiera wartości odpowiadające temu konkretnemu skrótowi. Dlatego postawiłbym na buckets_
.
Inna opcja: istnieją różne biblioteki dla Pythona ładnej drukarki dla gdb teraz i myślę, że można znaleźć taki, który działa z C++ 0x i sprawdzić, gdzie szuka wartości.
Jasne, mam sprawdzone realizacja gcc TR1 i struktury są całkiem różne, a zastąpić nie jest dobre, ponieważ znalazłem realizacja doładowania być szybszy niż odpowiednik tr1 – scooterman
- 1. Drukowanie wielu zmiennych w GDB?
- 2. drukowanie bardzo dużych liczb zmiennoprzecinkowych
- 3. Ładne drukowanie gdb z bezpośrednimi wywołaniami funkcji
- 4. Drukowanie wielu zmiennych z jednego polecenia w GDB
- 5. element unordered_map jest usuwany
- 6. SIGFPE przy dostępie unordered_map
- 7. Oddzielona wersja hash_map/unordered_map
- 8. poczekaj na dołączenie gdb
- 9. Przenoszenie kluczy z unordered_map
- 10. Punkt przerwania gdb na pthread_create
- 11. Jak grep na gdb print
- 12. Kiedy używasz std :: unordered_map :: emplace_hint?
- 13. Pycurl kontynuuje drukowanie na terminalu
- 14. Drukowanie wersji Pythona na wyjściu
- 15. Drukowanie Firemonkey na Mac OSX
- 16. Różnica między hash_map a unordered_map?
- 17. Drukowanie na LPT1 w języku C#
- 18. std :: unordered_map insert z podpowiedzią
- 19. Prostsza forma std :: unordered_map :: insert?
- 20. Dobre wyjaśnienie/dokumentacja na temat ftrace
- 21. mapa vs unordered_map dla kilku elementów
- 22. R + ggplot: drukowanie na wielu stronach
- 23. Czy to dobre miejsce na wzór PIMPL?
- 24. Drukowanie NSString
- 25. Android: drukowanie Bluetooth
- 26. Korzystanie gdb do konwersji adresów na linii
- 27. Python: debugowanie z gdb (na OSX)
- 28. Brak obsługi TUI dla gdb na Macu?
- 29. gdb nie zatrzymuje się na przerwie
- 30. Jak zmienić okno gdb tui na większe
wiem Trochę się spóźniłem, ale w jaki sposób mogę załadować (i użyć) tej ładnej drukarki w GDB? –
Dzięki za wysłanie tego. To nie działa dla późniejszych wersji (testowałem na 1.58+), ale wziąłem go i zaktualizowałem dziś rano, aby pracować z 1.58. Po nieco dłuższym czasie lotu zgłoszę prośbę o pociągnięcie do https://github.com/ruediger/Boost-Pretty-Printer, jeśli jest to w porządku. –