【问题标题】:On iOS, are 0x0000000000000026, 0x000000000000001c, 0x000000000000005a examples of tagged pointers?在 iOS 上,0x0000000000000026、0x000000000000001c、0x000000000000005a 是标记指针的示例吗?
【发布时间】:2018-09-10 21:05:46
【问题描述】:

在 iOS 11 上,当我故意创建将被标记为指针的对象时,它们以 0xB 开头,而不是 0x0000000000000026、0x000000000000001c、0x000000000000005a 值在我的崩溃报告中显示为无效地址。我认为这些可能是标记指针,但它们的格式不像我在调试器中看到的标记指针。

0x0000000000000010, 0x0000000000000020, 0x0000000000000030 呢?它们都有一个尾随的 0,但它们看起来确实小到令人怀疑是真正的指针。

【问题讨论】:

  • 您可能想提供更多上下文,一些代码,您看到的示例(包括日志和/或屏幕截图)...据我了解,标记指针有 1作为它们的最低有效位(即,它们是奇数)。

标签: ios objective-c xcode lldb


【解决方案1】:

标记指针的实现细节随着版本和架构的不同而变化。话虽如此,那些看起来确实不像标记的指针。

最有可能的是,某些代码正在解引用意外为 NULL 或 nil 的结构或对象。

运行此代码:

struct bob {
    void *a;
    void *b;
    void *c;
    char d[42];
};

int main(int argc, const char * argv[]) {
    struct bob *fred = NULL;

    fred->d[2] = 'q';
    return 0;
}

你会遇到这个崩溃(在 x86_64 上):Thread 1: EXC_BAD_ACCESS (code=1, address=0x1a)

也就是说,它试图通过 0x0 取消引用。因此,很可能您有一个为 NULL 的结构/对象引用,并且您的代码试图取消引用一个元素或实例变量,该元素或实例变量被您从一开始列出的十六进制 #s 偏移。

【讨论】:

  • 谢谢。所以,如果我理解正确的话,当我在 crashlytics 中得到一个带有 0 libobjc.A.dylib 0x1838697f4 objc_object::release() + 16 1 Security 0x18531b6b4 SecCertificateDestroy + 208 2 CoreFoundation 0x18463cc3c _CFRelease + 216 3 CoreFoundation 0x1845611b4 -[__NSArrayM dealloc] + 140 之类的堆栈跟踪的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000030 时,它可能与安全证书中某处的空指针有关?
  • 这是一个合理的分析,是的。
猜你喜欢
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多