如何最好地调试objc_msgSend中的崩溃?

时间:2009-08-24 21:27:42

标签: objective-c cocoa debugging crash

NSAutoreleasePool排水时,我发生了撞车事故。据推测,池正在尝试释放由另一段代码过早释放的对象。我遇到的崩溃是在objc_msgSend中,因为它试图向不再存在的对象发送消息。

鉴于堆栈状态,我可以使用哪些提示/技巧/进程/ gdb命令来获取有关对象的信息和/或非法释放发生的位置?

4 个答案:

答案 0 :(得分:16)

如果您有预感是过早删除,请启用僵尸确认您的假设,然后调试正在进行的操作。启用僵尸时,对象不会被真正破坏,而是设置为僵尸状态,这有助于您在调用dealloc后检测它们何时被访问。阅读NSZombieEnabled

的更多内容

答案 1 :(得分:5)

答案 2 :(得分:3)

如果你使用NSZombieEnabled,你至少可以弄清楚对象是什么类。

答案 3 :(得分:2)

我遇到了objc_msgSend中似乎崩溃的事情。甚至更奇怪的是application:didFinishLaunchingWithOptions:在所谓的崩溃发生之前甚至没有到达!

在我的情况下,崩溃原来是一个断点,我无意中设置了一个内存地址,在我的任何代码被触及之前被调用。

enter image description here

在试图解决这个问题的一小时左右之后,我取消选中了断点,运行了代码,面对掌控,然后继续我的一天假装它从未发生过......