2017-11-16 24 views
-1

난 표준이 : 내가 키로 shared_ptrs을 사용하고지도 :공유 PTR지도

std::map<shared_ptr<object>, shared_ptr<object>> 

그러나, 디버깅, 나는 맥 OS에 lldb를 사용하여 이러한지도를 열 수 없습니다 나는 경우 또는 리눅스에서 gdb. gdb의 경우 libstdcxx/v6/printers.py 파일을 수정하고 SharedPointerPrinter 클래스 (아래 코드 참조)에 반복기를 추가하여 우분투에서이 문제가 해결되었습니다. 그러나 lldb에 대해이 문제를 해결하는 방법을 모르겠습니다. 누구든지 나를 도울 수 있거나 올바른 방향으로 나를 가리킬 수 있다면 그것은 위대 할 것입니다.

이 문제를 해결하기 위해 다른 정보가 필요하면 알려 주시면 기꺼이 제공해 드리겠습니다.

class SharedPointerPrinter: 
    "Print a shared_ptr or weak_ptr" 

    class _iterator: 
     def __init__(self, sharedPointer): 
      self.sharedPointer = sharedPointer 
      self.managedValue = sharedPointer.val['_M_ptr'] 
      self.count = 0 

     def __iter__(self): 
      return self 

     def next(self): 
      if self.managedValue == 0: 
       raise StopIteration 
      self.count = self.count + 1 
      if (self.count == 1): 
       return ('Use count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_use_count']) 
      elif (self.count == 2): 
       return ('Weak count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_weak_count'] - 1) 
      elif (self.count == 3): 
       return ('Managed value', self.managedValue) 
      else: 
       raise StopIteration 

    def __init__ (self, typename, val): 
     self.typename = typename 
     self.val = val 

    def children (self): 
     return self._iterator(self) 

    def to_string (self): 
     state = 'empty' 
     refcounts = self.val['_M_refcount']['_M_pi'] 
     if refcounts != 0: 
      usecount = refcounts['_M_use_count'] 
      weakcount = refcounts['_M_weak_count'] 
      if usecount == 0: 
       state = 'expired, weakcount %d' % weakcount 
      else: 
       state = 'usecount %d, weakcount %d' % (usecount, weakcount - 1) 
     return '%s (%s) to %s' % (self.typename, state, self.val['_M_ptr']) 

답변

0
이 페이지에 설명 된대로 lldb의 파이썬 데이터 포맷터를 사용하여 거의 같은 일을 할 수

:

http://lldb.llvm.org/varformats.html

lldb 데이터 표준 : :지도 및 표준에 대한 포맷터 :: shared_ptr을위한있다 clang의 STL 버전. 예를 들어 다음과 같습니다.

(lldb) fr v a_map 
(std::__1::map<std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::less<std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::allocator<std::__1::pair<const std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > > >) a_map = size=1 { 
    [0] = { 
    first = "some text" strong=2 weak=1 { 
     __ptr_ = "some text" 
    } 
    second = "other text" strong=2 weak=1 { 
     __ptr_ = "other text" 
    } 
    } 
} 

사람, 그 C++ 유형은 자세한 정보입니다.

gcc의 STL에 대한 일부 포맷터가 있지만 해당 포맷터의 상태에 대해 많이 알지 못합니다.

IIUC 데이터 형식 지정자를 gdb의 표현식에 사용할 수 있습니다. lldb에서 frame variable 명령은 구조가 간단 접속 식을 받아 들일 것이다, 그래서 당신은 할 수 있습니다 :

(lldb) frame var a_map[0].first 
(const std::__1::shared_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >) a_map[0].first = "some text" strong=2 weak=1 { 
    __ptr_ = "some text" 
} 

하지만 당신은 전체 표현 파서에 데이터 포맷을 만들어 아이들을 사용할 수 없습니다.