【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. CF865D Buy Low Sell High 贪心

    正解:贪心 解题报告: 传送门! 这题首先有个很显然的dp,太基础了不说QAQ 然后考虑dp是n2的,显然过不去,所以换一个角度 然后发现这题和普通的dp的题有什么不同呢?就它这儿是一天只能买一支股, ...

  2. swift一些常用系统方法的简化使用

    //获取Image func FImage(_ imageName:String) -> UIImage { return UIImage(named:imageName)! } //获取Url ...

  3. (1)DBA查询:数据库

    1.数据库状态:[1]sys.databases   [2]exec sp_spaceused 2.数据文件状态:[1]sys.master_files [2]查看ldf与mdf:sp_helpfil ...

  4. (4.2)mysql备份还原——备份概述

    1.什么情况下会用到备份呢? [1.1]灾难恢复 [1.2]单位审计:数据库在过去某一个点是什么样的 [1.3]跨机房灾备:异地备份 [1.4]认为的DDL或者DML语句,导致主从库的数据消失 [1. ...

  5. 张小龙2018PRO版微信公开课演讲全文 透露2018微信全新计划

    大家好!我是张小龙.欢迎大家来到微信公开课. 刚刚出现的是我打游戏的画面,被大家看到了,那个不是我最好的水平,因为有点紧张,我最高分曾打到6000多分.当然我是练习了很久了,并不是我比大家更厉害,而是 ...

  6. 运维自动化工具ansible

    企业级自动化运维工具应用实战ansible 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出 ...

  7. xshell帮助

    查看内置命令 $help Internal Commands:new: Creates a new session.open: Opens a session or the session dialo ...

  8. PHP中parent、this、self和static的区别

    参考: http://www.cnblogs.com/devcjq/articles/2424738.html http://www.cnblogs.com/alsf/p/9621002.html h ...

  9. 调试https接口

    1. wireshark的 pre master key只能使用在浏览器上,现在mac电脑不支持chrome,只有firefox才有SSL的日志提供给wireshark. 2. wirshark不能解 ...

  10. Linux修改SSH登录端口

    Linux的默认登录端口为:22,为系统安全运维都会将端口改成其它端口. 假如我们修改的端口为:3000 1.首先要配置防火墙,允许此端口通行. /sbin/iptables -A INPUT -p ...