在开发调试的过程当中我们经常会用到gdb,并用gdb来进行调试,来帮助我们解决问题
但我们在调试过程中,发现gdb无法直接打印QString的值,这是因为
- GDB 默认集成了对 C++ 标准库(如 std::string、std::vector)的调试支持。它会通过 Python 脚本(称为 “Pretty-Printers”)自动解析这些类型的内部结构,直接输出可读的内容,
- 大多数标准库实现(如 GCC 的 libstdc++)中,std::string 直接存储指向字符数据的指针(或内联存储短字符串),GDB 可以直接找到原始字符数据的位置
而QString 是 Qt 框架的自定义类型,GDB 没有内置对其的支持。它的内存布局和调试信息需要额外的配置才能被正确解析;并且QString 内部使用 隐式共享(Copy-on-Write) 和 QArrayData 结构管理数据。直接打印时,GDB 只能看到其内部的指针和元数据,而非直观的字符串内容。例如:
// QString 的简化内存布局(实际更复杂)
struct QString {
QArrayData *d; // 指向数据头部的指针
// 数据头部包含引用计数、大小等信息
// 实际字符数据存储在头部之后的内存中
};
所以,想要用gdb打印出QString的值,还需要进行处理
下面是我的做法,新建文件.gdbinit
#filename: .gdbinit
#gdb will read it when starting
define pqstring
printf"(QString)0x%x(length=%i):\"",&$arg0,$arg0.d->size
set $i=0
while $i < $arg0.d->size
set $c=$arg0.d->data[$i++]
if $c < 32 || $c > 127
printf "\\u0x%04x", $c
else
printf "%c", (char)$c
end
end
printf "\"\n"
end
将文件放到代码目录,运行gdb后,执行 source .gdbinit,后面就可以通过命令:pqstring “变量” 来打印了