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

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

#include <QString>

int main(int argc, char *argv[])
{
    QString a = "abc";

    int i = 3;

    return 0;
}

在这里我们想打印a的值,我们把断点停到int i = 3上,然后p a可以看到下面的输出

(gdb) p a
$1 = {static null = {<No data fields>}, static shared_null = {ref = {
      _q_value = 2}, alloc = 0, size = 0,
    data = 0xb7fb14d2 <QString::shared_null+18>, clean = 0, simpletext = 0,
    righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}},
  static shared_empty = {ref = {_q_value = 1}, alloc = 0, size = 0,
    data = 0xb7fb14be <QString::shared_empty+18>, clean = 0, simpletext = 0,
    righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}},
  d = 0x804b008, static codecForCStrings = 0x0}

这个显然不是我们可以接受的,于是google了一番,发现还真有关于Qt的Printer,其实就是个py文件,下下来之后我们需要在我们自己的.gdbinit上加入

python
import sys
sys.path.insert(0, ‘/home/rickyk/.gdb‘) 

from qt4 import register_qt4_printers
register_qt4_printers (None)
end
set print pretty 1

可以看到里面调用了register_qt4_printers这个函数并完成了相关注册,将下好的qt4.py放到.gdb中之后重新gdb来查看a的值

(gdb) p a
$1 = "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

时间: 2024-08-04 22:04:07

解决GDB输出Qt内置类型的显示问题的相关文章

解决gdb 调试 core 文件函数名显示为问号的问题

关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样的使用在有些系统下支持不是很好,所以推荐用如下两种方法: 1) gdb exe (gdb) core-file core 2) gdb -c core (gdb) file exe

解决linux环境下qt groupbox 边框不显示问题

ps:实践是检验真理的唯一标准真的是没错,以为很简单一件事情,往往被自己搞的很复杂,这里记录下 在windows环境中Qt创建一个groupbox自动显示边框, 效果如下 然而在linux环境中Qt创建一个groupbox,边框竟然消失了 如图 然后以为是GroupBox的属性设置问题 结果在属性里面找了半天没有发现对应属性. 最后右键改变样式表解决 最后效果 ps:实践出真知啊! 解决linux环境下qt groupbox 边框不显示问题,布布扣,bubuko.com

C++ Primer(第五版) 第二章 基本内置类型

容易忘记的部分: 2.1:C++提供的几种字符串类型有哪些及其用途? 基本的字符类型char,一个char的类型和一个机器字节一样 其他字符类型用于拓展字符集,如wchar_t.char16_t.char32_t wchar_t类型确保可以存放机器最大拓展字符集中的任意一个字符 char16_t和char32_t则为Unicode字符集服务 2.2:如何选择所使用的类型 当数值不为负数时,使用无符号类型(unsigned) 一般常用int和long long执行整数的运算 算术表达式中不使用ch

QT内label控件通过opencv显示图像

1.对pro进行配置,使其能够理解opencv. INCLUDEPATH+=d:\opencv249\include\opencv d:\opencv249\include\opencv2 d:\opencv249\include LIBS+=d:\opencv249\lib\libopencv_calib3d249.dll.a d:\opencv249\lib\libopencv_contrib249.dll.a d:\opencv249\lib\libopencv_core249.dll.a

第2章 变量和基本内置类型

2.1 算术类型 bool char character 8 wchar_t wide character 16 char16_t Unicode character 16 char32_t Unicode character 32 short short integer 16 int integer 16 long long integer 32 long long 64 float single-precision floating-point 6 significant digits do

Python的内置类型续

Python不允许你使用一个未被赋值的变量.这样做会引发一个异常. Python的赋值: 一次赋多值:用Tuple的常量值,去赋予同样数目的变量值的Tuple. Python中的大多文档,都可使用Print 函数._doc_来查看.即是,基本Python中的每个 对象都有_doc_这样的一个属性. 格式化字符串: Python支持格式化的字符串输出. 最基本的用法是将一个值插到一个有字符串格式符%s(注意s是小写的Python大小写敏感)的字符串中. >>>k="Uid&quo

QT内使用OpenCV

在QT内使用Opencv,调试了好久总是出问题. 开始在pro文件内进行了opencv的配置,然后就是不能识别#include包含文件,后来不知道什么原因,神奇地 能够识别包含了. 可是,新的问题出现了,不能够识别cv函数,后来发现仅仅是不能识别opencv2.4函数,opencv1.0的函数还是可以识别的,使用IplImage能够正常显示图像. 后来不知道怎么回事,又神奇地可以识别opencv2.4.9函数了,可是此时不能显示图像,显示问题"qt opencv error assertion

golang的内置类型map的一些事

golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大区别,更像是一个指针,因为他有着跟指针一样行为. 下面这段代码的第三次输出时,尝试了用通过arr[1].c["aaa"] = "lalala",这种方式去修改这个map元素,发现arr[0]同时被改变了.这也就说明了arr里面保存的其实是指向一块内存的指针,所以在通过a

使用QT开发GoogleMap瓦片显示和下载工具(1)——QT开发环境准备

由于是第一次使用qt,光是QT的安装和调试就费了好大功夫,汗一个,下面记录下过程和遇到的问题的解决方法吧. 下载QT 直接Google搜索"QT",进入官网http://qt-project.org/,进行下载,我下载的是QT5.2版本,QT Library和QT Create一起绑定下载的 由于我电脑上只安装了VS2010,所以上面的这一项,至于其他选项,可以参考个人情况和喜好自行选择需要下载哪一项吧.恩,还有吐槽一下那个在线安装器,我还以为他会根据电脑的情况推荐下载选项,结果还是和