QTCreator调试器不显示STD :: String的值
QtCreator debugger does not display values of std::string
我试图调试我的小小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上)。
- 为std::string的某个索引赋值
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- Visual Studio 无法显示 std::string 的值
- GDB 8.1 无法在单线程简单程序中跟踪 std::string 变量的值
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- std::string::find 为取消引用的迭代器和等效字符串文本返回不同的值
- String.length() 显示不正确的值
- std::string 的转换运算符无法处理赋值
- 类型为'std::string&的非常量引用的初始化无效,并且从类型为'std::basic_string<char>的右值
- 为什么 std::string::max_size "strange" 的值是 ?
- std::vector<std::string>的内容在被分配为 R 值时会被移动吗?
- 如何将STD :: String的值复制到Char数组类型的结构成员
- QTCreator调试器不显示STD :: String的值
- 在函数中定义的 std::string 保留其先前的值
- std::string 应该按函数的值返回还是按"std::string &s"作为参数返回?
- 有什么方法可以将std :: string :: iterator的值存储在C 中的char *中
- c++如何打印另一种类型的变量的String属性的值
- 我可以使用<string>带有值参数化谷歌测试的向量吗
- 无法禁用 std::string 的返回值优化
- 如何使用std::string的值作为Flex规则的模式