为 Qt5 配置 GDB python 漂亮打印机

Posted

技术标签:

【中文标题】为 Qt5 配置 GDB python 漂亮打印机【英文标题】:Profile GDB python pretty printers for Qt5 【发布时间】:2017-05-11 09:52:37 【问题描述】:

我正在尝试使用 GDB python API 改进我自己的 GDB 漂亮打印机。

目前我正在用核心测试它们。

我正在尝试获取一些 QMap、QList 内容的信息,但它们包含的元素太多,以至于用它的内容打印它们真的很慢(几分钟)。

所以,我想知道是否有任何已知的方法来分析哪些部分较慢。

我已经检查过Python profile manual和google-perftools,但是我不知道如何在GDB执行周期中使用它们。

gdbcommands.txt:

source /home/user/codigo/git/kde-dev-scripts/gdb/load-qt5printers.py
source /home/user/codigo/myownprinters.py
core ../../core.QThread.1493215378
bt
p longQMapofQList

链接到load-qt5-printers.py content:

然后我启动 gdb 以自动运行这些命令:

gdb-multiarch --command=~/bin/gdbcommands.txt

【问题讨论】:

【参考方案1】:

它们有这么多元素,用它的内容打印它们真的很慢(几分钟)。

Qt 漂亮的打印机是否尊重print-elements 限制?你的限额是不是设得太高了?

分析在这里不太可能有帮助:如果您要打印一个包含(例如)1000 个元素的列表,GDB 可能需要执行 10,000 个或更多 ptrace 调用,并且~所有时间都花在等待这些调用上.

您可以在strace -c 下运行gdb 并观察在打印包含10 个元素和100 个元素的列表时执行了多少ptrace

如果增加是线性的,您可以尝试优化漂亮的打印机以减少访问次数。如果增加是二次方的,漂亮的打印机可能会进行不必要的指针追踪(这当然可以解释为什么打印长列表需要几分钟)。

【讨论】:

我已禁用打印限制,因为我想将它们全部打印出来。这就是为什么我寻求帮助来分析较慢的部分。而且是核心文件,据我所知,这里没有用到ptrace。谢谢你的回答。 @kikeenrique 假设您使用来自cgit.kde.org/kde-dev-scripts.git/tree/gdb 的 QT 漂亮打印机,我可以在 0.13 秒内从核心转储中打印带有 1000 个元素的 QList。您的列表有多大?

以上是关于为 Qt5 配置 GDB python 漂亮打印机的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

如何使用 Qt 5.5.1 在调试器中查看 QString 值

在gdb中禁用print pretty

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