내 std :: pretty printers 또는 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 파일에 등록 unorder_map를 추가하는 방법을 알고 : 너무 비슷한 스레드로 볼 수있는 기회를했다. 내 부스트 디렉토리의 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"
아무 래도이 클래스를 식별하지 못하는 것 같습니다. 내가 생각 그래서
@_register_printer
class BoostIteratorRange:
...
printer_name = 'boost::iterator_range'
version = '1.40'
type_name_re = '^boost::iterator_range<.*>$'
: 등록 사전에
덕분에
아마도 cython을 사용하여 부스트 라이브러리 주위에 파이썬 래퍼를 만들어야합니다. –
아니요, 이것은 gdb에서 실행되는 파이썬 코드와 관련이 있습니다. 당신은 boost를위한 python wrapper 나 cython을 필요로하지 않습니다. –