似乎总是这样,总是一开始不够仔细。于是,踏破铁鞋无觅处,...
Pretty-Printer
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几乎看不到任何信息,只能通过一点点看。
- 而如果我们为QByteArray写一个Pretty-Printer ,效果就不同的:
(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)
- 定义了一个类QByteArrayPrinter:控制打印的结果
- 定义一个函数 lookup_function:根据要打印的变量类型来确定使用哪一个Printer
- 定义一个函数register_printers:来注册我们的上一个查找函数
.gdbinit
Gdb启动时会加载一个名为.gdbinit的文件
注意:在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指定其所在目录。
gdb 与 python
linux下东西基本都是现成的。
在Windows下,
- Qt Creator 安装包中提供的gdb已经启用的python支持(而且自带了、嵌入了一个 python),可以直接使用。
- MinGW 官方提供的gdb二进制包中,也提供了支持python的版本,解压后可见到类似 gdb-python27.exe 的东西,但使用的话需要你自己安装相应版本的Python。
Qt Creator
前面说了一堆,其实Qt Creator并没有使用gdb提供的这个东西。而是自己弄了一套 dumper。原因见Peek
and Poke, Vol. 2一文中Andre给出的评论。在其安装目录下的 share\qtcreator\dumper 目录下可以看到相关的文件。如何扩展自己的类型,Qt Creator手册中有具体介绍。
Qt Creator 称其为 Debugging Helpers。有两套,
- 一套基于C++
- MSVC、Mac OS、老的linux发行版,只能用这个东西
- 另一套基于Python
参考
分享到:
相关推荐
该文档配合交叉编译器arm-linux-gnueabihf-gcc配置Qtcreater, 在Qt中开发ARM程序
适用于初学QT者,介绍QT creater开发环境的应用
qt-creater 企业版,适用于商业开发。
利用QT creater开发的串口收发上位机,简单的功能实现,代码简单易懂
QT createrQT createrQT createrQT creater
QtCreater 用 QtCreater可以很便捷的开发QT程序
本书适合QT4版本的编程爱好者,以前找了很久才找到,非常适合初学者,步骤非常详细。
简单的QT教程,适合初学者,介绍QT creater开发环境的应用。
QT createrQT createrQT createrQT creater
QT creater linux 4.8.6版本
QT Creater Qtableview demo
图文并茂,非常清晰明了的操作教程,对入门QtCreater很有帮助。
关于QT Creater环境sqliteBrowser
基于Qt Creater 开发平台上,用C++语言开发扫雷程序,可以直接导入运行
linux环境下的qtcreater安装教学过程。 以及window下的qtcreater安装详细教学过程。
自己的qtcreater中用的很爽的快捷键配置。
qt creater for windows x86 V4.0.3最新版本。
这是XP下的QT Creater 编写的网络程序中的客户端程序,已调试成功并能和配套的服务器通信
qt creater4.11.2 飞机大战完整代码