2014-01-21 3 views
0

내 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 gdbPretty 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<.*>$' 

: 등록 사전에

덕분에

+0

아마도 cython을 사용하여 부스트 라이브러리 주위에 파이썬 래퍼를 만들어야합니다. –

+0

아니요, 이것은 gdb에서 실행되는 파이썬 코드와 관련이 있습니다. 당신은 boost를위한 python wrapper 나 cython을 필요로하지 않습니다. –

답변

0

GitHub의에 부스트 인쇄 코드는 해당 프린터가 등록되어야 함을주의하는 데코레이터를 사용하고 클래스의 일부 필드는 제어 할 수 당신은 것들을 설정하는 다른 SO 게시물에 주어진 예제 코드에 추가 할 수 있습니다.

또는 등록 코드를 손으로 직접 작성할 수도 있습니다.

+0

위의 편집 된 섹션과 같이 boost 디렉토리의 printers.py 파일을 변경했지만, 정렬되지 않은 맵은 이해할 수없는 결과를 출력하지 않습니다. 내가 뭐 잘못하고 있니? – Spooferman

관련 문제