首页 > 解决方案 > 使用 lldb 进行调试

问题描述

全部,

考虑以下类结构:

类基 -> 类公共 Derived1 -> 类公共 Derived2。

即有一个基类。Derived1 类是 Base 的直接子代,而 Derived2 类是 Derived2 的直接子代,但不是 Base 的直接子代。

LLDB 中有没有办法查看类结构?

我正在尝试在 OSX 上使用 LLDB 调试我的程序,并且很难看到变量的类树。

我试着做:

> p (Derived1 *) this

但它没有帮助 - 它只是在输出中显示了相同的(Derived2)类及其地址。

谢谢你。

编辑:

v *this

结果是:

(lldb) v *this
error: the version command takes no arguments.
(lldb) 

编辑2:

这就是我得到的:

Igors-MacBook-Air:Debug igorkorot$ lldb
(lldb) version
lldb-902.0.79.7
  Swift-4.1
(lldb) 

标签: macoslldb

解决方案


lldb 默认显示使用其完整动态类型的表达式评估产生的对象。这是作为“值打印机”的一部分完成的,它在计算表达式后格式化结果。

你的表达式的结果是一个对象指针,它的静态类型是 Derived1(因为你强制转换它),但它的 vtable 指针指向 Derived2 vtable,表明它的完整动态类型是 Derived2,这就是 lldb 打印它的方式。

一般来说,这实际上非常方便。例如,如果您在 Base 的方法中,但this实际上是 Derived2,您通常希望看到完整的对象,而不仅仅是 Base 部分。

您可以使用以下方法关闭动态类型解析:

(lldb) expr -d no-dynamic-values -- (Derived *) this

此外,如果您要求 lldb 向您显示一个对象而不是对象指针,lldb 将显示它按类层次结构组织,基类嵌套在它们的父类中,每个子类的 ivars 嵌套在它们所属的类中。例如:

(lldb) v *this

我想告诉你你在找什么。


推荐阅读