3

是否有任何简单的方法可以编写脚本或某种代码来使用它们来观察 GDB 中的复杂对象?我能想到的一件事是在代码中为此目的提供特殊功能,并直接通过call debugViewer(object). 有没有更好的方法来做到这一点?

使用可视化调试器(例如 Qt Creator 中的调试器),您将如何做到这一点?

4

2 回答 2

3

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

另外关于完整性检查,实际上与您的问题无关,我发现几乎任何时候有人试图复制类似于 std::string、std::list 或 std::map 或其他任何东西的功能(通常用于“性能原因”),他们总是会出错,通常除了在难以测试的毛茸茸的边缘情况下不会出现。现在我已经通过编写数据结构类的数据结构完整性测试器朋友类三度发现了此类实现中的多个毛茸茸的边缘案例错误,其工作是简单地爬取整个数据结构(列表或树或其他) ) 一直到最后,寻找陈旧/损坏的指针(即在列表中,任何 'next->prev' 不等于 'this' 或 'prev->next' 不等于 ' 这'等)。其中一个数据结构是一个侵入式组合列表图(一个带有嵌入式 DAG 的列表),它的故障排除很有趣......在单独列表之间的几次拼接/传输操作之后,有很多机会搞砸向上链接并在一个列表中获取 DAG,并在另一个列表中引用节点。令人惊讶的是,在我编写完整性检查器并发现毛茸茸的边缘案例错误之前,该结构在内部使用了将近一年。

抱歉,我想这不是你的问题,但不管怎样,把它吐出来很有趣。

于 2012-05-10T17:22:19.207 回答
0

您可以尝试使用“Insight”,这是一个很好的 gdb 图形用户界面,请看:

GDB GUI 洞察力

于 2012-05-18T17:07:49.740 回答