我试图调试我的小词法分析器并遇到了这个问题:QtCreator-Debugger 不显示我的 std::string-variable 的任何内容。我尝试在控制台中对其进行调试,但得到了相同的结果,只是简单的结构信息。
我前几天用的那个版本的QtCreator确实显示了字符串的内容。所有其他 STL 元素,如 std::vector、std::map、std::multimap 等显示正确的数据,只是 std::string 类不正确。
经过几个小时的谷歌搜索后,我发现了很多描述 pretty-print 创建的网页,我解决这个问题的非常笨拙的方法并没有帮助。我有什么想法可以摆脱这个错误吗?
注意:字符串变量的“内容”将始终显示为“不可访问”。 我在 64 位 Linux 操作系统上使用 QtCreator 2.6 (QT5)。
编辑(1):我重新安装了从操作系统到编译器和 IDE 的一切...奇怪的是,当我使用优化级别 3 (-O3) 构建我的项目时,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 它的工作原理与你描述的完全一样: string not accessible
所以找到函数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()
指向那个 union ,其中包含 alloc size
值,不时。
看看你的std::string
类声明,这样您就可以在系统上获得结构。
修复后:
fixed debuger view
两者都有效 - 当“系统 GDB pretty-print ”选中并清除时
关于c++ - QtCreator 调试器不显示 std::string 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987699/