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

12

NSAutoreleasePool释放时,我遇到了崩溃。可能是由于其他代码过早地释放了池试图去释放一个对象导致的。我的崩溃发生在objc_msgSend中,因为它试图向一个不存在的对象发送消息。

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

4个回答

17
如果您怀疑这是一个过早的删除,请启用zombies来确认您的假设,然后调试发生了什么。启用zombies时,对象并没有真正被销毁,而是设置为僵尸状态,这有助于检测它们在dealloc被调用后是否被访问。从NSZombieEnabled阅读更多内容。

3
此外,您可以使用Instruments的对象分配工具来跟踪过早释放的对象的保留/释放事件。问题不在于自动释放池的-release,而是在先前的-release中,通常是这样的情况。 - bbum


4
我遇到了一个看起来是在objc_msgSend中崩溃的问题。更奇怪的是,在所谓的崩溃发生之前,application:didFinishLaunchingWithOptions:甚至都没有被调用!在我的情况下,崩溃实际上是一个断点,我不小心设置了一个内存地址,这个地址在我的代码被执行之前就被调用了。经过大约一个小时的尝试,我取消了断点,运行了代码,然后摊手一笑,继续假装没发生过任何事情...

4

如果您使用NSZombieEnabled,您至少可以确定对象所属的类。


2
虽然正确,tequilatango的答案提供了答案以及一些有用的细节。 - bbum
非常正确。 我至少可以提供一个外部信息的链接。 - Wevah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接