用于包含动态类的 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这个变量已经在你的程序中被优化掉了。来自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++ 调试的主要内容,如果未能解决你的问题,请参考以下文章