解决GDB输出Qt内置类型的显示问题
自从GDB 7.0之后,就加入了Pretty-Printer的这个概念。简单理解就是他可以让你用Python写一串脚本,然后让gdb去读取这串脚本后,可以自由的输出由你想自己定义的格式。我们直接举个简单例子:
#include <QString> int main(int argc, char *argv[])
{
QString a = "abc"; int i = ; return ;
}
在这里我们想打印a的值,我们把断点停到int i = 3上,然后p a可以看到下面的输出
(gdb) p a
$ = {static null = {<No data fields>}, static shared_null = {ref = {
_q_value = }, alloc = , size = ,
data = 0xb7fb14d2 <QString::shared_null+>, clean = , simpletext = ,
righttoleft = , asciiCache = , capacity = , reserved = , array = {}},
static shared_empty = {ref = {_q_value = }, alloc = , size = ,
data = 0xb7fb14be <QString::shared_empty+>, clean = , simpletext = ,
righttoleft = , asciiCache = , capacity = , reserved = , array = {}},
d = 0x804b008, static codecForCStrings = 0x0}
这个显然不是我们可以接受的,于是google了一番,发现还真有关于Qt的Printer,其实就是个py文件,下下来之后我们需要在我们自己的.gdbinit上加入
python
import sys
sys.path.insert(, '/home/rickyk/.gdb') from qt4 import register_qt4_printers
register_qt4_printers (None)
end
set print pretty
可以看到里面调用了register_qt4_printers这个函数并完成了相关注册,将下好的qt4.py放到.gdb中之后重新gdb来查看a的值
(gdb) p a
$ = "abc"
哈哈,大功告成,此时的QString变量也可以顺利输出了。
PS: 关于Qt Creator的Debug Helper和这篇文章的原理有点区别,Qt Creator采用的Debug技术只要是用了Python的dumper。因为兼容性的问题,Qt Creator要保证在绝大多数机器上都可以使用,所以gdb版本必须满足6.8.50才能支持支持Python脚本从而进行Pretty Printer,如果这样的话就不能保证所有的机器都可以正确看到Qt内置变量。所以Qt Creator用了gdb比较通用的特性----Compiled Dumpers,于是乎,Qt Creator自己写了一个Dumper专门用来配合Debug,这样解决了平台兼容性问题。当然了,目前很多Qt Creator安装包里都会自带一个支持Python的gdb也是出于这方面的考虑,总之这两套原理并不相同,也就是说,如果你想让你的终端gdb正常输出,你还是得去配一套Printer才可以。
参考链接:http://blog.csdn.net/dbzhang800/article/details/6830638
http://nikosams.blogspot.com/2010/01/gdb-qt-pretty-printers-updated.html
解决GDB输出Qt内置类型的显示问题的更多相关文章
- 解决gdb 调试 core 文件函数名显示为问号的问题
关于gdb调试core文件总是一堆问号的问题 问题描写叙述:已经在编译选项中增加了-g,可是查看core文件时.还是一堆问号,使用的命令为:gdb -c core 解决方式:因为gdb -c core ...
- 【Qt开发】【ARM-Linux开发】 QT在ARM上显示字体的问题
在PC机上利用QT开发的应用程序在设置字体时,在PC上运行,可根据自己的设置,字体随之变大或变小.而移植到ARM上运行时发现,显示字体与所设置的字体不用,字体普遍偏小.经过上网搜索发现,是环境变量字库 ...
- Qt和JavaScript使用QWebChannel交互一——和Qt内嵌网页交互
Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 目录 Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 前言 一.效果 二.实现过程 ...
- QT内使用OpenCV
在QT内使用Opencv,调试了好久总是出问题. 開始在pro文件内进行了opencv的配置,然后就是不能识别#include包括文件,后来不知道什么原因.奇妙地 能够识别包括了. 但是,新的问题出现 ...
- 为什么继承 Python 内置类型会出问题?!
本文出自"Python为什么"系列,请查看全部文章 不久前,Python猫 给大家推荐了一本书<流畅的Python>(点击可跳转阅读),那篇文章有比较多的"溢 ...
- golang的内置类型map的一些事
golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大 ...
- JavaScript备忘录(1)——内置类型
JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅. 值类型 我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的.值类型是不可 ...
- Python——内置类型
Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...
- C++基本内置类型
C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...
随机推荐
- hdu 4790 Just Random (2013成都J题) 数学思路题 容斥
题意:在[a,b] [c,d] 之间,和模p等于m的对数 详见代码 #include <stdio.h> #include <algorithm> #include < ...
- Sruts2文件上传的ContentType的取值列表
".*"="application/octet-stream" ".001"="application/x-001" & ...
- Unicode与 utf8的互相转换
<?php function unicode_encode($name) { $name = iconv('UTF-8', 'UCS-2', $name); $len = strlen($nam ...
- eclipse中建立tomcat容器
步骤 1. new - orther - server 出现下图,选择tomcat版本, 2. 选择已有的web项目至tomcat容器中,如果尚未建立,可不选. 3. 点击完成后,就会发现一个新建项 ...
- iOS UITextField 输入字数限制的实现
首先你的ViewController需要实现 UITextFieldDelegate 代理, 其次,需要字数限制的UITextField实例的代理要设置成 self(ViewController) 然 ...
- 一次mysql瘫痪解救
最近手机app项目访问流量逐步的增加,对服务端webapi考验极大,是在一次新的业务消息推送后,极光推送给手机接受到的客户端达到19万个,此时app立马开始访问速度变慢了,用户体验相当差 客服接到的问 ...
- 20169210《Linux内核原理与分析》第九周作业
第一部分:实验 首先还是网易云课堂的学习,这次的课程是可执行程序的装载. 预处理.编译和链接: 可执行程序是怎么来的 以c语言代码为例的话,经过预处理,编译成汇编代码,再汇编成目标码再链接可执行文件. ...
- 【转】android多分辨率适配
前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...
- 【剑指Offer学习】【面试题14 :调整数组顺序使奇数位于偶数前面】
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此全部的奇 ...
- ngnix apache tomcat集群负载均衡配置
http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...