【发布时间】:2010-11-22 10:20:35
【问题描述】:
NSAutoreleasePool 耗尽时发生崩溃。据推测,池正在尝试解除分配已被另一段代码过早释放的对象。我的崩溃发生在objc_msgSend 中间,因为它试图向一个不再存在的对象发送消息。
鉴于堆栈状态,我可以使用哪些提示/技巧/进程/gdb 命令来获取有关相关对象和/或发生非法释放的点的信息?
【问题讨论】:
标签: objective-c cocoa debugging crash
NSAutoreleasePool 耗尽时发生崩溃。据推测,池正在尝试解除分配已被另一段代码过早释放的对象。我的崩溃发生在objc_msgSend 中间,因为它试图向一个不再存在的对象发送消息。
鉴于堆栈状态,我可以使用哪些提示/技巧/进程/gdb 命令来获取有关相关对象和/或发生非法释放的点的信息?
【问题讨论】:
标签: objective-c cocoa debugging crash
如果您有预感这是过早删除,请让僵尸确认您的假设,然后调试正在发生的事情。当您启用僵尸时,对象并没有真正被销毁,而是设置为僵尸状态,这有助于您在调用 dealloc 后检测它们何时被访问。阅读更多来自NSZombieEnabled
【讨论】:
如果您使用 NSZombieEnabled,您至少可以弄清楚该对象是什么类。
【讨论】:
我在objc_msgSend 中遇到了似乎是崩溃的情况。更奇怪的是application:didFinishLaunchingWithOptions: 在所谓的崩溃发生之前甚至都没有到达!
在我的情况下,崩溃结果是我无意中在内存地址上设置了一个断点,该内存地址在我的任何代码到达之前就被调用了。
在尝试解决这个问题大约一个小时后,我取消检查断点,运行代码,然后继续我的一天,假装它从未发生过......
【讨论】: