`
tomhibolu
  • 浏览: 1431253 次
文章分类
社区版块
存档分类
最新评论

Qt Creater、Gdb之Pretty Printer小记

 
阅读更多
  • 有相当长一段时间,没搞清 Qt Creator 目录中的那堆python文件是干嘛用,以及在何处嵌入的python的解释器。
  • 后来用depends查看各个可执行文件,才发现是 gdb 在需要这些文件。可还是不清楚干嘛用的...
  • 再后来,终于注意到,Manual中对此不是说的很清楚么!Using Debugging Helpers

似乎总是这样,总是一开始不够仔细。于是,踏破铁鞋无觅处,...

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,调试时,查看变量bytes的值:

(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的文件

  • 系统级的init文件,gdb自身被编译时通过 --with-system-gdbinit 指定
  • 用户级init文件,在用户家目录下的~/.gdbinit(在windows下,通过环境变量HOME指定 fixme?)

  • 工作目录下的 .gdbinit 文件

注意:在window下,在Explorer中无法创建以"."开头的文件,但在控制台下可以。

所以,我们可以直接在工作目录下放置一个:

  • .gdbinit 文件

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
    • 易用、易扩展。但有些场合尚无法使用...

参考


分享到:
评论

相关推荐

    嵌入式Qtcreater环境搭建

    嵌入式QtCreator环境搭建的目的是为了在Qt环境中开发ARM架构的程序。Qt是一个跨平台的C++图形用户界面应用程序框架,广泛应用于桌面、嵌入式和移动设备。在嵌入式领域,QtCreator提供了与硬件相关的调试和开发工具,...

    QT CREATER 企业版

    "QT CREATER 企业版"是专为商业开发设计的版本,提供了更多的特性和支持,以满足企业在软件开发过程中的复杂需求。 1. **跨平台开发**:QT Creator的一大优势在于其跨平台性,支持Windows、Linux、macOS、Android...

    Qt Creater快速入门及本书源代码

    **Qt Creator快速入门及本书源代码** 在编程领域,Qt是一个强大的跨平台应用程序开发框架,由The Qt Company提供。Qt Creator是Qt的集成开发环境(IDE),它为开发者提供了便捷的编写、调试和运行Qt应用的环境。...

    QTcreater串口功能代码

    在本项目"QTcreater串口功能代码"中,我们聚焦于利用QT Creator实现串口通信的功能,这对于开发工业控制、数据采集等领域的上位机程序至关重要。 串口通信,也称为UART(通用异步接收/发送器),是计算机硬件中的一...

    QT creater

    QT createrQT createrQT createrQT creater

    qt自定义控件(开源)

    #ColorProgressBar 多彩进度条 编译环境: Qt5.x + mingw-QtCreater 运行截图: progressbarcolor为原版代码 #DynamicProgressBar 多态进度条 编译环境: Qt5.x + mingw-QtCreater 运行截图: #RoundProgressBar 编译...

    QT creater的使用教程

    ### QT Creator 的使用教程 **知识点一:QT Creator 的安装** - **下载**: 访问Qt官方网站(http://qt.nokia.com/downloads),选择适合Windows系统的Qt Creator版本进行下载。推荐下载的是Qt SDK for Windows,...

    osgearth在qt Creater下的工程,qt5.12,编译器msvc2017,osg3.4 osgearth2.8

    首先,我们关注的核心技术包括osg(OpenSceneGraph)和osgEarth,以及与之结合的Qt库。osg是一个高性能的3D图形库,而osgEarth则是建立在osg之上,用于构建地理信息系统(GIS)的应用。 标题提及的工程是为Qt 5.12...

    QT creater4

    在描述中多次提到 "QT createrQT createrQT createrQT creater",这可能是重复或打字错误,但我们可以理解为强调QT Creator的重要性或使用者对它的高度关注。QT Creator的核心特性包括: 1. **跨平台性**:QT ...

    linux环境下的qtcreater安装

    linux环境下的qtcreater安装教学过程。 以及window下的qtcreater安装详细教学过程。

    QTCreater自写义仿VS快捷键

    自己的qtcreater中用的很爽的快捷键配置。

    Qt creater C++开发扫雷源代码

    基于Qt Creater 开发平台上,用C++语言开发扫雷程序,可以直接导入运行

    qt creater part2

    qt creater for windows x86 V4.0.3最新版本。

    QT creater教程

    信号与槽是Qt的核心概念之一,它允许对象之间的通信和数据交换。学习信号与槽机制是理解Qt框架如何工作的关键。初学者需要了解如何定义信号,如何连接信号到槽函数,以及如何编写槽函数来响应信号。 组件布局是创建...

    QtCreater实现串口通信助手

    QtCreater串口助手,借助QSerialPort实现上位机串口通信,具备实时时间显示、在线端口搜索、串口配置、串口接收、串口发送以及窗口保存等功能。ComChat为源文件,ComChatInstall为打包好的可执行文件安装包。

    QT Creater简介

    1.1 Qt Creator的下载和安装 1.2 Qt Creator环境介绍 1.3 Qt工具简介 1.4 小结

    qt creater入门教程超详细代码知识点学习总结.docx

    qt creater Qt Creator 知识点详解 章节目录 1.Qt Creator 简介与界面概览 2.Qt Creator 的核心功能 3.Qt Creator 中的项目管理与构建 4.Qt Creator 的调试功能 5.Qt Creator 的高级特性与技巧 6.如何学习 Qt ...

    QtCreater.doc

    Qt Creator 是一个强大的集成开发环境(IDE),专为Qt应用程序设计和开发而打造。它提供了全方位的工具,从项目管理、代码编辑、编译构建到调试和部署,为开发者提供了便利的工作流程。Qt Creator的易用性和高效性...

    qt-creater

    Qt 的信号与槽机制是其核心特性之一,用于对象间的通信。此外,Qt Quick(QML)允许声明式编写用户界面,简化了动态和响应式 UI 的开发。 为了充分利用 Qt Creator,建议熟悉 C++ 和 Qt 的基础知识,同时掌握如 Git...

    QtCreater简明教程

    QtCreator是一款由Nokia推出的跨平台集成开发环境(IDE),专门用于Qt应用程序的开发。Qt是一个跨平台的C++应用程序框架,支持包括Linux(32位及64位)、MacOSX以及Windows在内的多个操作系统。QtCreator设计的初衷...

Global site tag (gtag.js) - Google Analytics