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