Theo liên kết của bạn, tôi đã làm chính xác những gì Michael mô tả và nó hoạt động tốt. Có lẽ, bạn đã làm một số sai lầm trong việc áp dụng các thay đổi. Các libstdcxx/v6/printers.py bây giờ sẽ có trong dòng 103-174:
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'])
class UniquePointerPrinter:
"Print a unique_ptr"
class _iterator:
def __init__(self, uniquePointer):
self.uniquePointer = uniquePointer
self.managedValue = uniquePointer.val['_M_t']['_M_head_impl']
self.count = 0
def __iter__(self):
return self
def next(self):
if self.managedValue == 0 or self.count == 1:
raise StopIteration
self.count = self.count + 1
return ('Managed value', self.managedValue)
def __init__ (self, typename, val):
self.val = val
def children (self):
return self._iterator(self)
def to_string (self):
v = self.val['_M_t']['_M_head_impl']
return ('std::unique_ptr<%s> containing %s' % (str(v.type.target()),
str(v)))
Kind coi
Cảm ơn, nó hoạt động đối với tôi bây giờ. Nhưng tôi nhận được một số cảnh báo trình gỡ rối: cảnh báo: biểu tượng RTTI không tìm thấy cho lớp 'std :: _ Sp_counted_ptr_inplace>, std :: allocator >>, (__gnu_cxx :: _ Lock_policy) 2> 'Tôi không chắc chắn nếu đó có thể là một vấn đề –
Johannes91
Có lẽ bạn đã vô hiệu hoá RTTI cho gcc bằng cờ -fno-rtti? Tôi không nhận được bất kỳ cảnh báo trình gỡ lỗi nào, bằng cách sử dụng phiên bản gcc MinGW-w64 64bit 6.2.0. Các tùy chọn g ++ của tôi là -O0 -g3 -Wall -c -fmessage-length = 0 -std = C++ 11 -D_FILE_OFFSET_BITS = 64 -D__WXMSW__ – xamid
Tuy nhiên, nếu trình gỡ rối của bạn bị lỗi, điều này không thực sự là vấn đề như được giải thích [tại đây] (http://stackoverflow.com/questions/12986261/warning-message-rtti-symbol-not-found-when-using-boostiostreams/12991374#12991374). – xamid