bas*_*h0r 6 c++ gdb qt-creator
我试图调试我的小lexer并遇到这个问题:QtCreator-Debugger没有显示我的std :: string-variable的任何内容.我尝试在控制台中调试它,我得到了相同的结果,只是简单的结构信息.
几天前我用过的QtCreator版本确实显示了字符串的内容.所有其他STL元素,如std :: vector,std :: map,std :: multimap等,都显示正确的数据,它只是std :: string类,它不能正确执行.
经过几个小时的谷歌搜索后,我发现很多网页都描述了漂亮的打印机的创建,我真正无声的修复方法并没有帮助.我有什么想法可以摆脱这个bug吗?
注意:字符串变量的"内容"将始终显示为"无法访问".我将QtCreator 2.6(QT5)用于64位Linux操作系统.
编辑(1):我重新安装了从操作系统到编译器和IDE的所有内容......奇怪的是,当我使用优化级别3(-O3)构建我的项目时,QT可以显示std :: strings.
命令行如下:clang ++ -std = c ++ 11 -O3 -g -c foo.cpp
当我删除-O3 std :: strings <not accessible>时.有任何想法吗?
Ast*_*sto 10
您可以尝试修复“/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
Run Code Online (Sandbox Code Playgroud)
在我的系统上 std::string 有下一个结构
pointer 8 byte
size 8 byte
union 16 byte
Run Code Online (Sandbox Code Playgroud)
这个union
字段可以改变其含义取决于字符串大小。所以我们需要评论该size < alloc
检查。
value.address()
- 字符串对象的地址,因此value.address() + d.ptrSize()
将不时指向大小,并value.address() + 2 * d.ptrSize()
指向包含alloc size
值的联合。
只需查看您的std::string
类声明,即可了解系统的结构。修复后:
修复调试器视图
两者都适用 - 当“系统 GDB 漂亮的打印机”被选中并清除时
试试这个,它对我有用.
在Qt Creator菜单栏中:
Tools -> Options -> Debugger
Uncheck the option (Load system GDB pretty printers)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5074 次 |
最近记录: |