使用 gdb 漂亮打印机在 eclipse cdt 中显示智能指针
Display smart pointers in eclipse cdt using gdb pretty printers
当我调试我的 c++11 应用程序时,我想查看 unique_ptr 和 shared_ptr 指向的对象。但是使用 libstdc++ 漂亮的打印机,只打印了一个带有地址和类似内容的字符串,但我无法展开它来查看它的内容。我已经尝试了以下解决方法,但对我不起作用:
https://sourceware.org/ml/gdb/2013-04/msg00042.html
任何人都可以帮助我。其实我认为这可能是一个非常基本的问题,所以我想知道是否没有办法这样做。但是在互联网上搜索我找不到任何提示...
按照您的 link,我完全按照 Michael 的描述进行了操作,并且效果很好。可能您在应用更改时犯了一些错误。 libstdcxx/v6/printers.py 现在应该在第 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)))
亲切的问候
当我调试我的 c++11 应用程序时,我想查看 unique_ptr 和 shared_ptr 指向的对象。但是使用 libstdc++ 漂亮的打印机,只打印了一个带有地址和类似内容的字符串,但我无法展开它来查看它的内容。我已经尝试了以下解决方法,但对我不起作用:
https://sourceware.org/ml/gdb/2013-04/msg00042.html
任何人都可以帮助我。其实我认为这可能是一个非常基本的问题,所以我想知道是否没有办法这样做。但是在互联网上搜索我找不到任何提示...
按照您的 link,我完全按照 Michael 的描述进行了操作,并且效果很好。可能您在应用更改时犯了一些错误。 libstdcxx/v6/printers.py 现在应该在第 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)))
亲切的问候