Симпатичное повышение печати:: unordered_map на gdb

недавно я начал использовать превосходное повышение:: unordered_map в моей системе, но получил один недостаток: Я не мог изобразить, как осмотреть его содержание. Печать его на gdb дает мне table_ и блоки _, но не нашла, где объекты. У кого-либо есть подсказка об этом?

6
задан Carl Manaster 10 May 2010 в 18:45
поделиться

2 ответа

Для тех, кто хотел принтер, мне удалось его создать. Вот код:

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
ответ дан 9 December 2019 в 20:40
поделиться

В типичной реализации хеш-таблицы сегменты содержат заголовок связанного списка, который на самом деле содержит значения, соответствующие этому конкретному хешу. Таким образом, я бы сделал ставку на buckets_ .

Другой вариант: сейчас для gdb существуют различные библиотеки симпатичных принтеров python, и я думаю, что вы могли бы найти ту, которая работает с C ++ 0x, и проверить, где она ищет значения.

2
ответ дан 9 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: