赞
踩
再后来,终于注意到,Manual中对此不是说的很清楚么!Using Debugging Helpers。
似乎总是这样,总是一开始不够仔细。于是,踏破铁鞋无觅处,...
Gdb 从7.0 开始增加了python脚本控制变量输出样式的特性。
先看个例子:
#include <QtCore/QtByteArray> #include <QtCore/QDebug> int main(int argc, char **argv) { QByteArray bytes("\x01\x00\x01\x02\x03", 5); qDebug()<<bytes.toHex(); }
g++ -g main.cpp -IE:\Qt\4.7.3\include -LE:\Qt\4.7.3\lib -lQtCore4 -o main
(gdb) p bytes $1 = {static shared_null = <optimized out>, static shared_empty = <optimized out>, d = 0x3e2a30} (gdb) p bytes.d.size $2 = 5 (gdb) p bytes.d.data[0] $3 = 1 '\001'
挺让难受的,直接看bytes几乎看不到任何信息,只能通过一点点看。
(gdb) p bytes $1 = "size: 5 data: 01 00 01 02 03"
准备脚本还是挺麻烦的,上面用的脚本是其实这个模样:
#qt_printer.py import gdb import re class QByteArrayPrinter(object): '''Print a QByteArray''' def __init__(self, val): self.val = val def to_string(self): size = self.val['d']['size'] data = self.val['d']['data'] res = "size: %d data: " % size for i in range(size): res += " %02X" % data[i] return res def display_hint (self): return 'string' def lookup_function (val): "Look-up and return a pretty-printer that can print val." typename = val.type.tag if typename == None: return None regex = re.compile('^QByteArray$') if regex.match(typename): return QByteArrayPrinter(val) return None def register_printers (obj): obj.pretty_printers.append (lookup_function)
Gdb启动时会加载一个名为.gdbinit的文件
用户级init文件,在用户家目录下的~/.gdbinit(在windows下,通过环境变量HOME指定 fixme?)
注意:在window下,在Explorer中无法创建以"."开头的文件,但在控制台下可以。
所以,我们可以直接在工作目录下放置一个:
python import sys sys.path.insert(0, 'd:\\Qt\\test-mingw') from qt_print import register_printers register_printers(gdb) end set print pretty 1
所做的工作就是调用一下我们上一个脚本中的 register_printers 这个函数,由于我们脚本文件随便放置,所以需要通过sys指定其所在目录。
linux下东西基本都是现成的。
在Windows下,
前面说了一堆,其实Qt Creator并没有使用gdb提供的这个东西。而是自己弄了一套 dumper。原因见Peek and Poke, Vol. 2一文中Andre给出的评论。在其安装目录下的 share\qtcreator\dumper 目录下可以看到相关的文件。如何扩展自己的类型,Qt Creator手册中有具体介绍。
Qt Creator 称其为 Debugging Helpers。有两套,
http://sourceware.org/gdb/current/onlinedocs/gdb/Pretty_002dPrinter-Introduction.html
http://nikosams.blogspot.com/2009/10/gdb-qt-pretty-printers.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。