【发布时间】:2017-11-16 22:45:51
【问题描述】:
我有一个 std::map,我使用 shared_ptrs 作为键:
std::map<shared_ptr<object>, shared_ptr<object>>
但是,在调试时,我无法在 macOS 上使用 lldb 或在 linux 上使用 gdb 打开这些地图。使用 gdb,通过修改文件 libstdcxx/v6/printers.py 并将迭代器添加到 SharedPointerPrinter 类(代码如下所示),此问题已在 Ubuntu 上得到修复。但是,我不知道如何为 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'])
【问题讨论】:
标签: c++ shared-ptr lldb stdmap