Xcode调试器(lldb)从内存地址获取对象描述

时间:2017-08-02 14:04:04

标签: xcode nsnotificationcenter lldb

鲜为人知的事实:现在可以在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获取 的对象?

编辑我在这里留下这个问题,但我认为正确的答案是LLDB (Swift): Casting Raw Address into Usable Type

所显示的那种事情。

3 个答案:

答案 0 :(得分:4)

Swill相当于Phillip的答案是:

...
public class VitalEntryValues {
    ...

    @EmbeddedId
    private VitalEntryValuesId vevId = new VitalEntryValuesId();

    ...
}

答案 1 :(得分:2)

po适用于地址(至少在Objective-C / Mac环境中)

  

e.g:

     

(lldb)po [NSNotificationCenter defaultCenter]

     

NSWindowDidResizeNotification,0x7fff9a0e98e0,0x6100001246a0,1400

     

(lldb)po 0x6100001246a0

     

ExpandOneView:0x6100001246a0

答案 2 :(得分:2)

首先,我使用的LLDB命令。

(lldb) expr -l objc -O -- 0x600001582d00

<__NSArrayI 0x600001582d00>(
<UIStoryboardShowSegueTemplate: 0x600002c3e4c0>,
<UIStoryboardPresentationSegueTemplate: 0x600001582210>,
<UIStoryboardPresentationSegueTemplate: 0x600001582620>,
<UIStoryboardShowSegueTemplate: 0x600002c3f4c0>,
<UIStoryboardPresentationSegueTemplate: 0x6000015839d0>,
<UIStoryboardShowSegueTemplate: 0x600002c3d680>,
<UIStoryboardEmbedSegueTemplate: 0x600002c3dc40>
)

用于Swift类的实例。

expr -l swift -O -- 

对于Objective-C类的实例。

expr -l objc -O --

对于C类的实例。

expr -l c -O --

现在,一个解释。我很高兴在我们的Jr中修复了1400多个lemlem泄漏。 iOS开发人员的代码。通常在使用Memory Graph Debugger时,当我检查泄漏的对象时,我所拥有的只是对象在内存中的地址。这是在Objective-C和Swift应用程序中进行的,因此我们必须能够检查两种语言的对象。在LLDB中,我必须在要检查的内存地址上指定变量的语言。这适用于Swift和Objective-C。我上面提供的是示例输出以及Swift,Objective-C和C的命令示例。