Xcode 调试器 (lldb) 从内存地址获取对象描述
Xcode debugger (lldb) get object description from memory address
鲜为人知的事实:现在可以在 Xcode 中暂停在调试器中,内省通知中心以了解注册了哪些对象以接收哪些通知:
(lldb) po NotificationCenter.default
<NSNotificationCenter:0x6040000d40b0>
Name, Object, Observer, Options
com.apple.accessibility.reduce.motion.status, 0x10b126190, 0x7fc795700140, 1001
com.apple.accessibility.asst.scanner.status, 0x10b126190, 0x7fc795700140, 1001
// ... etc. ...
很好,但是如何从获取内存地址 0x7fc795700140
到了解 是 的对象?
编辑 我把这个问题留在这里,但我认为正确的答案是
中显示的那种东西
po
适用于地址(至少在 Objective-C/Mac 上下文中)
e.g.:
(lldb) po [NSNotificationCenter defaultCenter]
NSWindowDidResizeNotification, 0x7fff9a0e98e0, 0x6100001246a0, 1400
(lldb) po 0x6100001246a0
ExpandOneView: 0x6100001246a0
Phillip 的答案等价于 Swift 是:
(lldb) expr -l objc -O -- 0x7fc795700140
<UIApplication: 0x7fc795700140>
首先,我使用的LLDB命令。
(lldb) expr -l objc -O -- 0x600001582d00
<__NSArrayI 0x600001582d00>(
<UIStoryboardShowSegueTemplate: 0x600002c3e4c0>,
<UIStoryboardPresentationSegueTemplate: 0x600001582210>,
<UIStoryboardPresentationSegueTemplate: 0x600001582620>,
<UIStoryboardShowSegueTemplate: 0x600002c3f4c0>,
<UIStoryboardPresentationSegueTemplate: 0x6000015839d0>,
<UIStoryboardShowSegueTemplate: 0x600002c3d680>,
<UIStoryboardEmbedSegueTemplate: 0x600002c3dc40>
)
对于 Swift class 的实例。
expr -l swift -O --
对于 Objective-C class 的实例。
expr -l objc -O --
对于 C 的实例 class。
expr -l c -O --
现在,一个解释。我很高兴在我们的 jr. 中修复了 1400 多个内存泄漏。 iOS 开发者代码。通常,当我在内存图调试器中检查泄漏的对象时,我所拥有的只是对象在内存中的地址。这是在 Objective-C 和 Swift 应用程序中,因此我们必须能够检查两种语言的对象。在 LLDB 中,我必须在被检查的内存地址指定变量的语言。这在 Swift 和 Objective-C 中有效。我上面提供的是 Swift、Objective-C 和 C.
的示例输出和命令示例
鲜为人知的事实:现在可以在 Xcode 中暂停在调试器中,内省通知中心以了解注册了哪些对象以接收哪些通知:
(lldb) po NotificationCenter.default
<NSNotificationCenter:0x6040000d40b0>
Name, Object, Observer, Options
com.apple.accessibility.reduce.motion.status, 0x10b126190, 0x7fc795700140, 1001
com.apple.accessibility.asst.scanner.status, 0x10b126190, 0x7fc795700140, 1001
// ... etc. ...
很好,但是如何从获取内存地址 0x7fc795700140
到了解 是 的对象?
编辑 我把这个问题留在这里,但我认为正确的答案是
po
适用于地址(至少在 Objective-C/Mac 上下文中)
e.g.:
(lldb) po [NSNotificationCenter defaultCenter]
NSWindowDidResizeNotification, 0x7fff9a0e98e0, 0x6100001246a0, 1400
(lldb) po 0x6100001246a0
ExpandOneView: 0x6100001246a0
Phillip 的答案等价于 Swift 是:
(lldb) expr -l objc -O -- 0x7fc795700140
<UIApplication: 0x7fc795700140>
首先,我使用的LLDB命令。
(lldb) expr -l objc -O -- 0x600001582d00
<__NSArrayI 0x600001582d00>(
<UIStoryboardShowSegueTemplate: 0x600002c3e4c0>,
<UIStoryboardPresentationSegueTemplate: 0x600001582210>,
<UIStoryboardPresentationSegueTemplate: 0x600001582620>,
<UIStoryboardShowSegueTemplate: 0x600002c3f4c0>,
<UIStoryboardPresentationSegueTemplate: 0x6000015839d0>,
<UIStoryboardShowSegueTemplate: 0x600002c3d680>,
<UIStoryboardEmbedSegueTemplate: 0x600002c3dc40>
)
对于 Swift class 的实例。
expr -l swift -O --
对于 Objective-C class 的实例。
expr -l objc -O --
对于 C 的实例 class。
expr -l c -O --
现在,一个解释。我很高兴在我们的 jr. 中修复了 1400 多个内存泄漏。 iOS 开发者代码。通常,当我在内存图调试器中检查泄漏的对象时,我所拥有的只是对象在内存中的地址。这是在 Objective-C 和 Swift 应用程序中,因此我们必须能够检查两种语言的对象。在 LLDB 中,我必须在被检查的内存地址指定变量的语言。这在 Swift 和 Objective-C 中有效。我上面提供的是 Swift、Objective-C 和 C.
的示例输出和命令示例