如何在 gdb 中观察复杂对象

How to watch complex objects in gdb?

本文关键字:观察 复杂 对象 gdb      更新时间:2023-10-16

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

使用可视化调试器(例如Qt Creator中的调试器(如何以不同的方式执行此操作?

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

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

对不起,我想这不是你的问题,但无论如何,吐槽它很有趣。

您可以尝试使用"Insight",这是一个不错的gdb GUI,看看这个:

GDB GUI 洞察