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 ...
随机推荐
- kubernetes微服务部署
1.哪些服务适合单独成为一个pod?哪些服务适合在一个pod中? message消息服务被很多服务调用 单独一个pod dubbo服务和web服务交互很高放在同一个pod里 API网关调用很多服务 ...
- 洛谷P3233 世界树 [HNOI2014] 虚树
正解:虚树 解题报告: 传送门! 首先看到这种就要想到虚树这个是毫无疑问的QwQ 建虚树什么的都可以循规蹈矩地做,不说辣,具体可以看下虚树学习笔记什么的看下板子 但是建好虚树之后怎么搞还是有点儿讲究, ...
- magento开发手册之目录结构
magento是一个很优秀的电商系统,很多朋友会用它部署自己的电商网站,少不了二次开发.下面我们随着ytkah来一起认识一下magento开发手册之目录结构吧. /app – 程序根目录 /app/e ...
- react native获取屏幕的宽度和高度
var Dimensions = require('Dimensions'); var {width,height} = Dimensions.get("window");//第一 ...
- 20165236 2017-2018-2 《Java程序设计》第九周学习总结
20165236 2017-2018-2 <Java程序设计>第九周学习总结 一.第十三章教材内容总结 1.URL类 URL类是java.net包中的一个重要的类,使用URL创建对象的应用 ...
- mysql 远程登录 设置
1.在服务器上通过命令行或客户端登录mysql:2.执行以下sql:GRANT ALL PRIVILEGES ON 开放权限的数据库.* TO 用户名@"%" IDENTIFIED ...
- vue 获取屏幕宽高 width height
/** * 获取屏幕宽高 */ Vue.prototype.getViewportSize = function(){ return { width: window.innerWidt ...
- sap gui 配置
1: sap gui 安全配置 ,在左下角搜索sap gui configuration.
- ES6语法 promise用法
ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...
- left join不同写法导致数据差异
select m.*, p.specification, p.sales_price, p.promotion_price from product_detail p left join PRODUC ...