用gdb在命令行打印出QString的值

在开发调试的过程当中我们经常会用到gdb,并用gdb来进行调试,来帮助我们解决问题

但我们在调试过程中,发现gdb无法直接打印QString的值,这是因为

  1. GDB 默认集成了对 C++ 标准库(如 std::string、std::vector)的调试支持。它会通过 Python 脚本(称为 “Pretty-Printers”)自动解析这些类型的内部结构,直接输出可读的内容,
  2. 大多数标准库实现(如 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 “变量” 来打印了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值