用于包含动态类的 stl 容器的 lldb C++ 调试

Posted

技术标签:

【中文标题】用于包含动态类的 stl 容器的 lldb C++ 调试【英文标题】:lldb C++ debug for stl container containing dynamic class 【发布时间】:2014-03-21 18:54:03 【问题描述】:

我正在 Xcode 上编写 C++,唯一的选择是 lldb。我定义了一个类型为

的变量
std::list<State> states;

Class 是一个自定义类。我尝试使用 expr 命令和 帧变量,但它们无济于事。

expr 的结果是

错误:无法实现结构:变量状态的大小 (24) 与 ValueObject 的大小 (0) 不一致

帧变量的结果是

(std::__1::list<State, std::__1::allocator<State> >) states = <variable not available>

【问题讨论】:

有没有办法在调试 lldb 时查看 states 的内容? @JasonMolenda 我做了更多的实验。如果我将状态类型从 std::list 更改为 std::list,一切正常。所以lldb不知道我的自定义类。 【参考方案1】:

这个变量已经在你的程序中被优化掉了。来自expr/p 的错误消息有点不幸 - 树的顶部发生了变化,应该允许发出真正的错误 - 但行为是正确的。 frame variable 输出是正确的错误消息。

你总是可以的

(lldb) image lookup -v -a $pc

查看程序中某一点上所有可见变量的位置。它们以 DWARF 表达式的形式表示,通常以帧基址寄存器 (DW_OP_fbreg) 的形式表示,例如在 x86_64 上通常为 rbp

如果列出的变量带有空的location= 字段,则表示该变量的值在此电脑位置不可用。

【讨论】:

谢谢。但是我对lldb不熟悉,我怎么能看到我的例子中的状态内容? 这不是 lldb 问题——此时没有调试器可以显示变量的内容。你的程序是用优化构建的吗?在调试时尝试禁用优化。优化代码后,通常可以在您期望它们可用的地方消除变量......或者它们可能可用但编译器的调试信息没有描述如何找到它们。 我禁用了代码生成优化,但还是不行。 expr 仅在第一次分配 states 后才起作用,但是当我第一次 push_back 状态时,它停止工作。有什么办法可以查看状态的内容吗?你知道,在 Visual Studio 中,我当然可以尽可能地看到每个变量的内容。谢谢。 我试过你的方法,但是将 optimisation 级别设置为 none 似乎没有什么不同。还有其他方法可以提供帮助吗?非常感谢。@jason 你不需要相信我的话。在 Xcode 中将您的构建设置更改为 DWARF + dSYM,重新构建项目,您的 .app 包旁边将是一个 .app.dSYM 包。在上面运行dwarfdump。在文本中找到您的函数的名称。然后在文本中找到变量的名称。您将看到函数中的地址范围列表,以及该变量在每个这些范围中的位置。如果您在定义 loc 的范围之一中停止,lldb 将显示该值。否则,lldb 不会。这都是关于来自编译器的调试信息。它与lldb无关。

以上是关于用于包含动态类的 stl 容器的 lldb C++ 调试的主要内容,如果未能解决你的问题,请参考以下文章

C++中STL学习笔记——容器之vector

C++从青铜到王者第十五篇:STL之queue类的初识和模拟实现

C++笔记--STL编程

C++学习之旅第六站:让我们一起走进 STL库

C++标准库

C++ :1STL 的容器概述array容器详解迭代器初步分析