macos - 使用 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)
解决方案
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
我想告诉你你在找什么。
推荐阅读
- android - 如何检查具有不同路径的 URL 与 API 相同
- java - 将 JRE 与 launch4j 捆绑在一起
- java - 画布矩形位置
- typescript - 如何在 Azure Blob 存储中捕获上传失败瞬时错误?
- c++ - 为什么没有 std::string::append/insert recivieng 右值字符串?
- javascript - 如何使用 JavaScript 在 HTML 页面上搜索多个单词?
- mongodb - 无法运行 mongodb-community 版本
- json - 如何使 dict 子类 json 可序列化?
- python - 执行 curl 命令并获取响应
- php - 获取数组列表中的第一个数字