使用 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
谁能帮我。实际上,我认为这可能是一个非常基本的问题,所以我想知道是否有办法这样做。但是在互联网上搜索我找不到任何提示...
按照您的链接,我完全按照迈克尔的描述做了,并且工作正常。可能,您在应用更改时犯了一些错误。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)))
亲切问候
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Eclipse CDT 将 static_assert(cond) 突出显示为语法错误
- Eclipse 在我安装 CDT 后没有显示任何C++项目选择
- 日食 CDT 显示错误图标
- Mac OSX 上的 Eclipse CDT 未在首选项集中显示调试菜单
- 使用 gdb 漂亮的打印机在 eclipse cdt 中显示智能指针
- 通过指针在 gdb/Eclipse CDT 调试监视中显示真实的对象层次结构
- Eclipse CDT 无法在 Windows 中运行编译的可执行文件,并显示错误"terminated, exit value: <some number>"
- Eclipse CDT构建控制台输出不显示整个编译器输出
- Eclipse CDT显示语义错误,但构建成功