【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的更多相关文章

  1. QT 随笔目录

    [1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...

  2. 解决GDB输出Qt内置类型的显示问题

    自从GDB 7.0之后,就加入了Pretty-Printer的这个概念.简单理解就是他可以让你用Python写一串脚本,然后让gdb去读取这串脚本后,可以自由的输出由你想自己定义的格式.我们直接举个简 ...

  3. GDB源代码查找路径

    在gdb程序的时候,有时候会发现源代码文件找不到,对于那些带调试信息的系统库或者第三方库,很多时候当你真正想gdb去追他源代码的时候你会发现gdb根本找不到这些源代码路径.这个时候有两种选择: [1] ...

  4. xcode调试打印QString

    xcode调试打印QString xcode内置GDB,在调试工程过程中可以通过print命令打印基本的数据类型,但像QString这样复杂类型就不行了.虽然我们可以在程序代码通过添加Qt的调试打印语 ...

  5. gdb基本命令(非常详细)

    gdb基本命令 本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. ...

  6. 在 Python 中使用 GDB 来调试 转载

    2013/11/01 | Comments 大约一年前,我接触了 Java 中的 Btrace 能够不停机查看线上 JVM 运行情况的特性让我艳羡不已. 另外还有强悍的 jStack 和 jConso ...

  7. 【转载】gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 U ...

  8. gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令.  主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 ...

  9. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

随机推荐

  1. NMAP执行脚本smb-check-vulns.nse出错

    错误信息:NSE: failed to initialize the script engine: /usr/bin/../share/nmap/nse_main.lua:801: ‘smb-chec ...

  2. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  3. 在同一台电脑上部署多个tomcat服务器

    因为在写一些小的项目的时候,需要另外用到一台图片服务器,所以不得不开启多个tomcat了. 在这里我用的是tomcat 9.0,一个是正常时的tomcat,一个是图片服务器,在这里我就用tomcat1 ...

  4. 汇编-5.0-[BX]和loop指令

    1.要完整的描述一个内存单元,需要两种信息:1.内存单元的地址:2.内存单元的长度(类型). 2."()"表示一个寄存器或一个内存单元中的内容.如:(ax)表示ax中的内容. &q ...

  5. rpm 安装软件包

    RPM 是RedHat Package Manager (RedHat软件包管理工具)类似windows里面的“添加/删除程序”,rpm执行安装包 RPM执行安装.删除.更新 常用命令组合 -ivh: ...

  6. CentOS 7.2编译安装nginx1.10.3+MySQL5.5.38+PHP5.5.38

    1.关闭firewallad 关闭防火墙 systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.ser ...

  7. 20170915 shell

    1.什么是Shell 一种电脑程序与文本文件,利用Shell 可以进行系统管理,文件操作等. 2.认识bash 这个Shell 由于管理整个计算机硬件的其实是操作系统的内核(kernel),用户一般都 ...

  8. FastReport快速安装教程

    安装后需要覆盖的文件全部复制到安装目录 替换后的安装目录 选中Recompile右键必须以管理员运行 看图选择 编译后,需要汉化的话看下图选择 怎么添加Library直接看图按顺序进行 选择insta ...

  9. 数据库---mysql的介绍和安装

    MySQL数据库 一.简介: mysql是数据库管理软件:套接字:服务端,客户端 支持并发:操作得是共享得数据 处理锁,数据安全,性能 用别人得软件,得照着别人得规范,组织自己得语法规则 二.概述: ...

  10. Centos7上安装及配置Apache

    Apache HTTP服务器是世界上最流行的Web服务器. 它是一款免费的开源和跨平台的HTTP服务器,提供强大的功能,可以通过各种模块进行扩展. 以下说明介绍如何在CentOS 7机器上安装和管理A ...