如何在gdb中观看复杂的对象?

时间:2012-05-09 22:33:14

标签: c++ c gdb qt-creator

有没有简单的方法来编写某种脚本或代码来使用它们来观看GDB中的复杂对象?我能想到的一件事是在代码中为此目的使用特殊函数,并通过call debugViewer(object)直接调用它们。有没有更好的方法呢?

如何使用Qt Creator中的可视调试器以不同的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

我使用GDB的DDD图形界面,它专门用于显示您可能称之为“复杂对象”的内容。但是,话虽如此,我发现在除了普通的类/结构之外的任何东西中编写dbg()方法通常更好,其好处是dbg()方法不仅可以将对象的内容打印到stdout,它还可以进行自定义对象完整性检查,包括验证拥有/连接的对象是否处于预期状态等,并且它可以隐藏它知道有效的信息但通常对调试没有帮助,除非你向它传递“详细”标志(或者有详细的单独功能)。为了更容易从GDB命令行调用该方法,我编写了非成员方法,这些方法按照您在帖子中建议的方式获取指向目标对象的dbg()方法的指针。

另外关于完整性检查而且实际上与你的问题无关,我发现几乎任何时候有人试图复制类似于std :: string,std :: list或std :: map等的功能(通常出于“性能原因”),它们总是会出错,通常是一些不会出现的东西,除了难以测试的毛边缘情况。现在三次我通过编写数据结构类的数据结构完整性测试程序友元类来发现这种实现中的多个毛边错误,其作用是简单地爬行整个数据结构(列表或树或其他)一直到最后,寻找陈旧/腐败的指针(即在列表中,任何其'next-> prev'不等于'this'或'prev-> next'不等于'this',等等)。其中一个数据结构是一个侵入性组合列表图(带有嵌入式DAG的列表),排除故障后很有趣....在单独列表之间进行多次拼接/转移操作后,有很多机会可以解决链接&将DAG放在一个列表中,引用另一个列表中的节点。令人惊讶的是,在我编写完整性检查程序并发现毛边边缘情况之前,该结构已在内部使用了将近一年。

对不起,我想这不是你的问题所在,但无论如何都要大肆宣传它。

答案 1 :(得分:0)

您可以尝试使用“Insight”,这是gdb的一个很好的GUI看看:

GDB GUI Insight