C++ 漂亮的打印增强::gdb上无序的_图

C++ 漂亮的打印增强::gdb上无序的_图,c++,boost,gdb,C++,Boost,Gdb,最近我开始在我的系统上使用优秀的boost::unordered_映射,但有一个缺点:我不知道如何检查它的内容。在gdb上打印它会给我一个表和一个桶,但是没有找到项目的位置。有人对此有线索吗?在一个典型的哈希表实现中,bucket包含一个链表的头,该链表实际上包含与该特定哈希对应的值。因此,我会赌桶 另一个选项是:现在有各种各样的python pretty打印机库用于gdb,我认为您可以找到一个与C++0x一起工作的库,并检查它在哪里查找值。对于需要打印机的库,我已经设法创建了一个。以下是代码:

最近我开始在我的系统上使用优秀的boost::unordered_映射,但有一个缺点:我不知道如何检查它的内容。在gdb上打印它会给我一个表和一个桶,但是没有找到项目的位置。有人对此有线索吗?

在一个典型的哈希表实现中,bucket包含一个链表的头,该链表实际上包含与该特定哈希对应的值。因此,我会赌


另一个选项是:现在有各种各样的python pretty打印机库用于gdb,我认为您可以找到一个与C++0x一起工作的库,并检查它在哪里查找值。

对于需要打印机的库,我已经设法创建了一个。以下是代码:

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"
类BoostUnderedAppInter:
“打印boost::无序的_映射”
类_迭代器:
定义初始化(自我,字段):
type_1=fields.val.type.template_参数(0)
type_2=fields.val.type.template_参数(1)
self.bucket=fields.val['table\']['bucket\']
self.bucket\u count=fields.val['table\u']['bucket\u count\u']
自当前_bucket=0
pair=“std::pair”%(类型1,类型2)
self.pair\u pointer=gdb.lookup\u类型(pair.pointer)()
self.base_pointer=gdb.lookup_type(“boost::无序_detail::value_base<%s>“%pair”)。指针()
self.node_pointer=gdb.lookup_type(“boost::无序_detail::hash_node,boost::无序_detail::ungroup>“%pair”)。指针()
self.node=self.bucket[self.current\u bucket]['next\u']
定义(自我):
回归自我
def next(自我):
而不是self.node:
self.current\u bucket=self.current\u bucket+1
如果self.current\u bucket>=self.bucket\u count:
提出停止迭代
self.node=self.bucket[self.current\u bucket]['next\u']
迭代器=self.node.cast(self.node\u指针).cast(self.base\u指针).cast(self.pair\u指针).dereference()
self.node=self.node['next_u']
返回(“%s”%iterator['first'],iterator['second']))
定义初始值(self,val):
self.val=val
def儿童(自我):
返回self.\u迭代器(self)
def到_字符串(自):
return“boost::无序映射”

当然,我已经检查了gcc tr1实现,结构非常不同,替换并不好,因为我发现boost实现比tr1对手快。我知道我有点晚了,但是我如何在GDB中加载(和使用)这台漂亮的打印机呢?谢谢发布这篇文章。它不适用于更高版本(我已经在1.58+上测试过了),但我今天早上将它更新为1.58。再飞行一段时间后,如果您同意的话,我将提交一个请求。