QTCreator调试器不显示STD :: String的值

QtCreator debugger does not display values of std::string

本文关键字:String 的值 STD 显示 调试器 QTCreator      更新时间:2023-10-16

我试图调试我的小小lexer并遇到这个问题:qtcreator-debugger不会显示我的std :: string-variable的任何内容。我试图在控制台上调试它,并获得了相同的结果,只是简单的结构信息。

我几天前使用的QTCreator版本确实显示了字符串的内容。所有其他STL元素,例如std :: vector,std :: map,std :: multimap等。显示正确的数据,只是std :: string class,它不执行正确。

经过几个小时的谷歌搜索,我发现了许多网页来描述了精美打印机的创建,我真正的解决方法可以解决此问题。有什么想法我如何摆脱这个错误?

注意:字符串变量的"内容"将始终显示为"不访问"。 我将QTCreator 2.6(QT5)用于64位Linux OS。

编辑(1):我重新安装了从OS到编译器和IDE的所有内容...奇怪的是,当我使用优化级别3(-O3)QT构建项目时,QT可以显示STD :: Strings。

命令行如下:clang -std = C 11 -O3 -G -C foo.cpp

当我删除-o3 std :: strings时,<无法访问>。有什么想法吗?

您可以尝试修复"/usr/share/qtcreator/debugger/stdtypes.py"。当他们使用"成员位置上的硬码假设"时,似乎无处不在。在我的情况下-Linux X64,GCC 9.1它的工作原理与您描述的完全一样: 字符串无法访问

因此查找功能def qdumpHelper_std__string(d, value, charType, format):

和更改 (size, alloc, refcount) = d.split("ppp", data - 3 * d.ptrSize())(size, alloc, refcount) = d.split("ppp", value.address() + d.ptrSize())

也注释d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)或将其更改为

之类的东西
if size > 1000:
   size = 1000

在我的系统std :: String上有下一个结构

pointer 8 byte
size    8 byte
union   16 byte

union字段可以更改其含义取决于字符串大小。因此,我们需要评论size < alloc检查。 value.address()-字符串对象的地址,因此value.address() + d.ptrSize()将指向大小,并且value.address() + 2 * d.ptrSize()指向该联合,该联合不时地包含alloc size值。

只需查看您的std::string类声明,就可以在系统上获得结构。修复后:固定调试器视图

两者都可以使用 - 当检查"系统GDB漂亮打印机"并清除

尝试一下,对我有用。
在QT创建者菜单栏中:

Tools -> Options -> Debugger
Uncheck the option (Load system GDB pretty printers)

澄清并总结astobasto post:在文件中:/usr/share/qtcreator/debugger/stdtypes.py替换此功能:

def qdumpHelper_std__string(d, value, charType, format):
[...]

与此:

def qdumpHelper_std__string(d, value, charType, format):
if d.isQnxTarget():
    qdumpHelper__std__string__QNX(d, value, charType, format)
    return
if d.isMsvcTarget():
    qdumpHelper__std__string__MSVC(d, value, charType, format)
    return
data = value.extractPointer()
# We can't lookup the std::string::_Rep type without crashing LLDB,
# so hard-code assumption on member position
# struct { size_type _M_length, size_type _M_capacity, int _M_refcount; }
(size, alloc, refcount) = d.split("ppp", value.address() + d.ptrSize())
refcount = refcount & 0xffffffff
d.check(refcount >= -1) # Can be -1 according to docs.
if size > 4002:
    size = 4002
d.putCharArrayHelper(data, size, charType, format)

这起作用(至少在Kubuntu 19.10上)。