我在[pool drain]中有一个罕见的(匿名命名空间):: AutoreleasePoolPage :: pop(void *)崩溃。据我所知,它是由自动释放池拥有的某些对象的过度释放引起的。
我尝试使用NSZombieEnabled = YES,并使用带有僵尸追踪器的乐器。这些错误不可复制。控制台中没有记录过度释放消息,僵尸跟踪器不显示任何僵尸警报。但是当我取下这些旗帜时,崩溃是非常频繁的。有人看到过类似的行为吗?
还有其他方法可以轻松调试吗?我在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
提前致谢。
答案 0 :(得分:0)
[__NSDictionaryM dealloc]
正在取消分配字典。
CFRelease
当取消分配字典时,每个键和值都会收到release
条消息。
但是,字典中的一个对象已经被释放,这意味着发送另一条release
消息会导致非法访问。
检查字典中的键/值,你是否过度释放其中一个。我建议您还要执行完整的项目清理,然后进行深入分析(请参阅Project
菜单)。在大多数情况下,这将帮助您找到错误。
您还可以向NSDictionary dealloc
添加符号断点,等待它触发,然后使用调试器检查内部数据的状态。