【发布时间】: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