gpt4 book ai didi

c++ - 如何在 gdb 中观察复杂的对象?

转载 作者:太空狗 更新时间:2023-10-29 21:26:48 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

抱歉,我猜你的问题不是这个,但无论如何吐槽它很有趣。

关于c++ - 如何在 gdb 中观察复杂的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com