带有 Qt 漂亮打印机的 gdb

Posted

技术标签:

【中文标题】带有 Qt 漂亮打印机的 gdb【英文标题】:gdb with Qt pretty printers 【发布时间】:2011-02-11 09:21:55 【问题描述】:

我的目标是允许在 gdb 中漂亮地打印 Qt 类。 即如果我有:

QString str("str"); 

在我的代码中执行

(gdb) print qwe 

我希望打印 str 内容(不是真正的 QString 结构)。

gdb 本身支持使用 python 定义漂亮的打印机,Qt Creator 似乎部分使用了这个特性。

理想的解决方案是使用 Qt 附带的漂亮打印机(可以在 QT_INSTALLATION\share\qtcreator\gdbmacros 中找到)或者甚至是整个调试器(可以在 QT_INSTALLATION\pythongdb 中找到)。

不管怎样,巨魔们构建了一个新的 api 来在标准 gdb api 上定义漂亮的打印机,我不知道如何在普通的 gdb 调试器中启用它。

那么,有没有办法在没有 Qt Creator 的情况下启用 Qt 的漂亮打印机来运行 gdb,或者任何有关如何管理它的信息。

【问题讨论】:

【参考方案1】:

我不认为 Qt Creator 在 strict sense 上使用漂亮的打印机,他们可能使用 GDB/MI 接口直接访问变量及其内容。如果您想使用 Pretty Printers 显示 QString 内容,您可以简单地检查类型中的哪个位置是真正的字符串,然后显示它。这里是 C++ std::string 类型的 an example:

 class StdStringPrinter:
     "Print a std::string"

     def __init__ (self, val):
         self.val = val

     def to_string (self):
         return self.val['_M_dataplus']['_M_p']

     def display_hint (self):
         return 'string'

注意val['_M_dataplus']['_M_p']上类的区间变量的访问。

【讨论】:

【参考方案2】:

实际上有一些漂亮的 qt 打印机: http://nikosams.blogspot.com/2009/10/gdb-qt-pretty-printers.html

【讨论】:

【参考方案3】:

Qt Creator 确实使用 gdb 的 python 脚本来进行漂亮的打印,但它没有使用 gdb 的基于 python 的漂亮打印机制,它不能处理更复杂的情况,如 QObject 属性。不过,这种机制会产生 gdb/MI 风格(看起来有点像 JSON)的输出,因此人类在命令行上不容易阅读。 http://doc.qt.nokia.com/qtcreator-snapshot/creator-debugging-helpers.html上有一些关于接口的简约文档

【讨论】:

以上是关于带有 Qt 漂亮打印机的 gdb的主要内容,如果未能解决你的问题,请参考以下文章

是否可以生成一个伪类型,以便我可以伪造 gdb 漂亮的打印系统?

如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?

如何使用 gdb 制作一个可以漂亮地打印每个对象的 C++ 函数?

Boost 无序地图漂亮打印机正在多次打印值以及不需要的值

GDB:打印/转储到文件时自动展平结构

在gdb中禁用print pretty