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

posted @ 2014-12-25 16:13  Ricky.K  阅读(2719)  评论(0编辑  收藏  举报