【问题标题】:Debugging with lldb使用 lldb 进行调试
【发布时间】:2021-07-01 23:23:40
【问题描述】:

所有,

考虑以下类结构:

class Base -> class public Derived1 -> class public 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) 

【问题讨论】:

    标签: macos lldb


    【解决方案1】:

    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
    

    我想告诉你你在找什么。

    【讨论】:

    • 我猜你的意思是p *this。问题是 - 它确实显示了层次结构,但它给了我没有类型的变量(成员)名称,并且原始对象没有被向上/向下转换。我有几个对象,我需要了解调用虚函数的问题出在哪里。所以我需要查看对象的类型树。
    • 不,我的意思是v。对于查看堆栈局部变量等,v 是一个更有效的命令。如果您想查看子元素的类型,请将-T 参数传递给v 或使用expr -T --。使用不需要向上转换的动态类型,它将显示完整的类型,因此没有什么可以转换的。如果您想向下转换,请使用 -no-dynamic-values。
    • 顺便说一句,如果您想查看对象的 vtable,请知道 lldb 不会将其打印为对象的一部分。在大多数情况下,人们不希望每次检查对象时都必须回顾过去,因此它不在原始可变打印中。应该有一些其他命令会显示这个,但它还不存在。
    • 你知道如何从 Xcode 调试吗?当我尝试时,它立即失败,除了 dylib 加载一些汇编代码。甚至在应用程序启动之前。我确实制作了一个脚本将它们复制到Application Bundle。但我认为 Xcode 会在其他地方期待它们。
    • 请看我的编辑。显然v 用于版本。
    猜你喜欢
    • 2022-06-12
    • 2013-08-24
    • 1970-01-01
    • 2016-02-06
    • 2016-07-26
    • 2022-01-11
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多