带有 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 漂亮打印?