当NSAutoreleasePool
排水时,我发生了撞车事故。据推测,池正在尝试释放由另一段代码过早释放的对象。我遇到的崩溃是在objc_msgSend
中,因为它试图向不再存在的对象发送消息。
鉴于堆栈状态,我可以使用哪些提示/技巧/进程/ gdb
命令来获取有关对象的信息和/或非法释放发生的位置?
答案 0 :(得分:16)
如果您有预感是过早删除,请启用僵尸确认您的假设,然后调试正在进行的操作。启用僵尸时,对象不会被真正破坏,而是设置为僵尸状态,这有助于您在调用dealloc后检测它们何时被访问。阅读NSZombieEnabled
的更多内容答案 1 :(得分:5)
关于此类崩溃的权威文章:http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html
答案 2 :(得分:3)
如果你使用NSZombieEnabled,你至少可以弄清楚对象是什么类。
答案 3 :(得分:2)
我遇到了objc_msgSend
中似乎崩溃的事情。甚至更奇怪的是application:didFinishLaunchingWithOptions:
在所谓的崩溃发生之前甚至没有到达!
在我的情况下,崩溃原来是一个断点,我无意中设置了一个内存地址,在我的任何代码被触及之前被调用。
在试图解决这个问题的一小时左右之后,我取消选中了断点,运行了代码,面对掌控,然后继续我的一天假装它从未发生过......