GDB && QString
【1】GDB && QString
GDB的print命令仅能打印基本数据类型,而像QString这样的复杂类型就无能为力了!
如果调试时不能看QString的值,很让人抓狂!!!幸好,GDB提供了扩展功能,可以自定义宏命令。
把如下自定义的宏命令放到$HOME/.gdbinit文件中,每次启动GDB时会自动加载。
自定义宏命令内容如下:
define printqstring
printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size
set $i=
while $i < $arg0.d->size
set $c=$arg0.d->data[$i++]
if $c < || $c >
printf "\\u0x%04x", $c
else
printf "%c", (char)$c
end
end
printf "\"\n"
end
上面的代码是从坊间摘录的。坊间指导:直接复制到$HOME/.gdbinit文件中就可以。
针对如上指导,问题有二:
1.gdbinit文件找不到怎么办?得先找到gdbinit文件。针对像我这种菜鸟,提示操作如下:

红色框中为gdbinit文件本地实际路径。
2.宏命令添加好后怎么使用呢?
一般使用print命令:print VariableName (简写:p VariableName)
类比使用,针对该宏命令,使用示范:printqstring VariablenName
if 如上操作,的确成功了,请到此为止。否则,请继续往下看。
【2】问题分析
本地使用宏命令过程中发现有问题,提示如下:
"cannot resolve overloaded method `data': no arguments supplied”
异常现象截图如下:

经分析,研究Qt源码QString类过程如下:
class Q_CORE_EXPORT QString
{
public:
typedef QStringData Data;
// ..... TODO
Data *d;
// ..... TODO
}; typedef QTypedArrayData<ushort> QStringData; template <class T>
struct QTypedArrayData
: QArrayData
{
// ..... TODO
T *data() { return static_cast<T *>(QArrayData::data()); }
const T *data() const { return static_cast<const T *>(QArrayData::data()); }
// ..... TODO
}; struct Q_CORE_EXPORT QArrayData
{
QtPrivate::RefCount ref;
int size;
uint alloc : ;
uint capacityReserved : ; qptrdiff offset; // in bytes from beginning of header void *data()
{
Q_ASSERT(size ==
|| offset < || size_t(offset) >= sizeof(QArrayData));
return reinterpret_cast<char *>(this) + offset;
} const void *data() const
{
Q_ASSERT(size ==
|| offset < || size_t(offset) >= sizeof(QArrayData));
return reinterpret_cast<const char *>(this) + offset;
}
// ..... TODO
};
备注:本地调试QT版本为5.3.2
需要修正命令,如下所述。
【3】修正命令
自定义宏命令内容修改如下(ps: 与上个版本差异仅在第5行):
define printqstring
printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size
set $i=
while $i < $arg0.d->size
set $c=$arg0.d->data()[$i++]
if $c < || $c >
printf "\\u0x%04x", $c
else
printf "%c", (char)$c
end
end
printf "\"\n"
end
经验证,效果正常。正常使用示例如下所述。
【4】使用示例
4.1 源码如下:
void WinHelpManual::openUrl()
{
QString Html = m_view_list.selectedHtml();
QString strUrlExp = "outline_[0-9]*.htm";
QRegExp urlRegExp(strUrlExp, Qt::CaseSensitive);
if (urlRegExp.indexIn(Html) != -)
{
QString strWebUrl = urlRegExp.cap(); // 匹配到的url
m_view_contents.setUrl(QUrl(m_path + strWebUrl));
}
}
4.2 正常使用截图如下:

备注:红色框中为字符串值。
【5】利用toStdString()接口
有同事提到可以利用toStdString()接口查看值。
经本地验证,的确可以。但字符串比较长时,打印仍存在问题:
5.1 短字符串,应用示例:

5.2 长字符串,应用示例:

总上所述:建议添加printqstring自定义宏命令,实际应用过程中“因地制宜”。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
GDB && QString的更多相关文章
- QT 随笔目录
[1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...
- 解决GDB输出Qt内置类型的显示问题
自从GDB 7.0之后,就加入了Pretty-Printer的这个概念.简单理解就是他可以让你用Python写一串脚本,然后让gdb去读取这串脚本后,可以自由的输出由你想自己定义的格式.我们直接举个简 ...
- GDB源代码查找路径
在gdb程序的时候,有时候会发现源代码文件找不到,对于那些带调试信息的系统库或者第三方库,很多时候当你真正想gdb去追他源代码的时候你会发现gdb根本找不到这些源代码路径.这个时候有两种选择: [1] ...
- xcode调试打印QString
xcode调试打印QString xcode内置GDB,在调试工程过程中可以通过print命令打印基本的数据类型,但像QString这样复杂类型就不行了.虽然我们可以在程序代码通过添加Qt的调试打印语 ...
- gdb基本命令(非常详细)
gdb基本命令 本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. ...
- 在 Python 中使用 GDB 来调试 转载
2013/11/01 | Comments 大约一年前,我接触了 Java 中的 Btrace 能够不停机查看线上 JVM 运行情况的特性让我艳羡不已. 另外还有强悍的 jStack 和 jConso ...
- 【转载】gdb基本命令总结
本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 U ...
- gdb基本命令总结
本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 ...
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...
随机推荐
- NMAP执行脚本smb-check-vulns.nse出错
错误信息:NSE: failed to initialize the script engine: /usr/bin/../share/nmap/nse_main.lua:801: ‘smb-chec ...
- docker之Dockerfile指令介绍
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...
- 在同一台电脑上部署多个tomcat服务器
因为在写一些小的项目的时候,需要另外用到一台图片服务器,所以不得不开启多个tomcat了. 在这里我用的是tomcat 9.0,一个是正常时的tomcat,一个是图片服务器,在这里我就用tomcat1 ...
- 汇编-5.0-[BX]和loop指令
1.要完整的描述一个内存单元,需要两种信息:1.内存单元的地址:2.内存单元的长度(类型). 2."()"表示一个寄存器或一个内存单元中的内容.如:(ax)表示ax中的内容. &q ...
- rpm 安装软件包
RPM 是RedHat Package Manager (RedHat软件包管理工具)类似windows里面的“添加/删除程序”,rpm执行安装包 RPM执行安装.删除.更新 常用命令组合 -ivh: ...
- CentOS 7.2编译安装nginx1.10.3+MySQL5.5.38+PHP5.5.38
1.关闭firewallad 关闭防火墙 systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.ser ...
- 20170915 shell
1.什么是Shell 一种电脑程序与文本文件,利用Shell 可以进行系统管理,文件操作等. 2.认识bash 这个Shell 由于管理整个计算机硬件的其实是操作系统的内核(kernel),用户一般都 ...
- FastReport快速安装教程
安装后需要覆盖的文件全部复制到安装目录 替换后的安装目录 选中Recompile右键必须以管理员运行 看图选择 编译后,需要汉化的话看下图选择 怎么添加Library直接看图按顺序进行 选择insta ...
- 数据库---mysql的介绍和安装
MySQL数据库 一.简介: mysql是数据库管理软件:套接字:服务端,客户端 支持并发:操作得是共享得数据 处理锁,数据安全,性能 用别人得软件,得照着别人得规范,组织自己得语法规则 二.概述: ...
- Centos7上安装及配置Apache
Apache HTTP服务器是世界上最流行的Web服务器. 它是一款免费的开源和跨平台的HTTP服务器,提供强大的功能,可以通过各种模块进行扩展. 以下说明介绍如何在CentOS 7机器上安装和管理A ...