解决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

转载于:https://www.cnblogs.com/rickyk/p/4184912.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值