我想通过更新我的std :: pretty打印机或boost :: prettyprinters的现有printers.py文件来添加新的漂亮打印机。 使用以下链接正确设置它们: https://sourceware.org/gdb/wiki/STLSupport https://github.com/ruediger/Boost-Pretty-Printer
我也经历了他们的教程添加新的打印机,但不知何故未能得到很好的理解。还有机会调查类似的线程: pretty printing boost::mpl::string<...> types in gdb 和 Pretty printing boost::unordered_map on gdb
知道如何添加在printers.py文件中注册的上述boost :: unorder_map会很棒。我对boost目录中的printers.py文件进行了以下修改
@_register_printer
class BoostUnorderedMapPrinter:
"Pretty printer for a boost::unordered_map"
printer_name = 'boost::unordered_map'
version = '1.40'
type_name_re = '^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"
不知何故,它似乎无法识别这个类。
提前致谢
答案 0 :(得分:0)
github上的提升打印代码使用装饰器来记录应该注册给定的打印机,然后在类中的一些字段来控制注册:
@_register_printer
class BoostIteratorRange:
...
printer_name = 'boost::iterator_range'
version = '1.40'
type_name_re = '^boost::iterator_range<.*>$'
所以我想你可以将这些添加到其他SO帖子中给出的示例代码中进行设置。
或者你可以自己亲自编写注册码。
答案 1 :(得分:0)
可能不是最好的方法,但是它可以为我快速调试会话:
import gdb
import re
def lookup_type(val)
resolved_type = str(val.type.unqualified().strip_typedefs())
if (re.search("^boost::unordered_map>.*>$", resolved_type):
return BoostUnorderedMapPrinter()
gdb.pretty_printers.append (lookup_type)