c++ - QtCreator 调试器不显示 std::string 的值

标签 c++ gdb qt-creator

我试图调试我的小词法分析器并遇到了这个问题: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/

相关文章:

gdb - 查看以前的 gdb 命令

qt - 将单元测试项目添加到现有的 Qt Creator 项目

c++ - 如何找出 cpp 中的字符串中是否有 std::vector?

c++ - Mac OSX 已弃用的 API - FSRef 引用;

c++ - 从 SetupDiGetClassDevs 获取设备接口(interface)

gdb - 使用 GDB 调试使用 Rust 1.10 编译的程序时无法在 main 上设置断点

c++ - DirectWrite 中的 RTL 文本宽度

c++ - gdb如何附加到多线程进程

python - qt快速应用程序中找不到qmake选项

c++ - 如何让 "Application"项目模板重新出现在 Qt Creator IDE 中?