如何在 gdb 中观察复杂对象
How to watch complex objects in gdb?
有没有简单的方法来编写某种脚本或代码来使用它们来监视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 洞察
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 使用 Python Extension API 包装复杂C++类
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 将平面阵列重塑为复杂的特征类型
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在复杂继承中访问静态成员变量
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- OpenCV 傅里叶变换复杂输出问题
- 具有嵌套 if-else 的循环的时间复杂度
- 在 for 循环中处理复杂的发送 recv 消息
- 如何在 gdb 中观察复杂对象