【问题标题】:Is there a way to tell where to look in memory for the specific location of a property of an object?有没有办法告诉在内存中查找对象属性的特定位置的位置?
【发布时间】:2017-07-05 22:15:26
【问题描述】:

所以这个问题可能是无效的,取决于我的理解,

但是假设我们在堆上有一个对象,比如在 0x618000001234

如果我使用 Xcode 的内存调试器来查看该地址的内存, 我只是看到一堆信息,对吧?

现在就我的理解而言,您会在该地址找到的第一件事是 isa 指针,它是 Class AKA objc_class

而且看起来只占用了 8 个字节

所以在这个例子中:

看起来isa 的内容是: 011DFFFF9C1B89F9

很好,很好,花花公子

假设我们有一个类

@interface testClass : NSObject
@property int testIntProperty;
@end

假设isa之后内存中没有任何内容,它直接进入属性, 如果我们查看testClass 实例在内存中的位置, 我希望前 8 个字节是 isa,然后接下来的 4 个字节是 int 属性,然后其余的无关紧要

所以我的问题是: 在那个例子中,我们可以知道testIntProperty 将位于对象开头的 8 个字节处,只需查看属性的标题

但是有没有办法准确地知道它的位置,比如是否有 10 个属性,并且您想知道第 10 个属性在哪里?

我问的原因是因为我想查看特定属性的指针,而我很难在内存中找到它。在运行时,我得到一个 EXC_BAD_ACCESS,地址为0x18,但我很想在内存中实际查看我希望该属性存在的位置,并且我想清楚地看到 0x18

【问题讨论】:

  • 您可以使用call (int)[0x618000001234 testIntProperty] 在调试器中检查属性的值。如果属性是指向对象的指针,请使用po [0x618000001234 testObjectProperty]

标签: objective-c memory lldb


【解决方案1】:

在现代运行时中,您不能假设类的布局只是按顺序排列的实例变量/属性;你可以在多个地方声明它们——接口和实现,你必须知道使用了什么填充,你不知道什么时候处理属性支持变量等等。

但是,您可以在调试器中轻松确定偏移量。假设您在 testClass 的实例方法中,所以 self 引用它输入:

p (char *)&self->_testIntProperty - (char *)self

它会打印偏移量。需要强制转换才能让调试器满意。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2021-06-28
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多