【问题标题】:Crash in autoreleasePool drain在 autoreleasePool 排水管中崩溃
【发布时间】:2013-12-02 11:22:52
【问题描述】:

我在 [pool drain] 中遇到了一个罕见的 (anonymous namespace)::AutoreleasePoolPage::pop(void*) 崩溃。据我了解,这是由自动释放池拥有的某些对象的过度释放引起的。

我尝试使用 NSZombieEnabled = YES,并使用带有僵尸追踪器的 Instruments。这些错误无法重现。控制台中没有记录过度释放消息,并且僵尸跟踪器不显示任何僵尸警报。但是当我取下这些标志时,崩溃是非常频繁地重现的。有人见过类似的行为吗?

还有其他方法可以轻松调试吗?我在 OS 10.8.5 中使用 Xcode 5.0.1。我在下面粘贴崩溃的线程跟踪:

异常类型:EXC_BAD_ACCESS (SIGSEGV)

异常代码:EXC_I386_GPFLT

应用特定信息: objc_msgSend() 选择器名称:release

0 libobjc.A.dylib 0x00007fff8b3040a3 objc_msgSend +35

1 com.apple.CoreFoundation 0x00007fff855d086f CFRelease + 591

2 com.apple.CoreFoundation 0x00007fff856028a9 -[__NSDictionaryM dealloc] + 249

3 libobjc.A.dylib 0x00007fff8b30665a(匿名 namespace)::AutoreleasePoolPage::pop(void*) + 502

4 com.apple.ist.istcore 0x000000010fb91d82 -[SomeFileOperation main] + 117

5 com.apple.Foundation 0x00007fff81f2070b NSThread__main + 1318

6 libsystem_pthread.dylib 0x00007fff86389899 _pthread_body + 138

7 libsystem_pthread.dylib 0x00007fff8638972a _pthread_start + 137

8 libsystem_pthread.dylib 0x00007fff8638dfc9 thread_start + 13

提前致谢。

【问题讨论】:

  • 你能放一些代码吗?
  • 我无法输入确切的代码.. 对此感到抱歉。我有 SomeFileOperation 类(NSOperation 的子类)。我已经覆盖了 -main 方法,并在那里做与下载文件相关的事情。我在 -main 方法中的代码周围有 @autoreleasepool。
  • 我正在寻找轻松调试的方法,因为僵尸追踪器在这里没有帮助。我没有看到 NSZombieEnabled 的过度释放日志,但是当这个标志被禁用时它会崩溃。

标签: objective-c memory-management


【解决方案1】:

[__NSDictionaryM dealloc]

一个字典正在被释放。

CFRelease

当一个字典被释放时,每个键和值都会收到一个release 消息。

但是,字典中的一个对象已经被释放,这意味着发送另一个 release 消息会导致非法访问。

检查字典中的键/值,您正在过度释放其中一个。我建议您还执行完整的项目清理,然后进行深入分析(请参阅Project 菜单)。在大多数情况下,这将帮助您找到错误。

您也可以在NSDictionary dealloc 中添加符号断点,等待它触发,然后使用调试器检查内部数据的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多