我正在用Objective-C编写一个应用程序,我得到了这个错误:
MyApp(2121,0xb0185000) malloc:*对象0x1068310的错误:双重释放
*在malloc_error_break中设置断点进行调试
当我释放一个NSAutoreleasePool,但我不能确定我释放了两次的对象时,就会发生这种情况。
我怎么设置他的断点?
有没有办法知道这个“对象0x1068310”是什么?
发布于 2009-06-11 03:33:59
当一个对象被“双重释放”时,最常见的原因是你正在(不必要地)释放一个自动释放的对象,然后当包含的自动释放池被清空时,它会被自动释放。
我发现跟踪额外版本的最好方法是在Xcode中对受影响的可执行文件使用NSZombieEnabled环境变量。要快速了解如何使用它,请查看this CocoaDev wiki page。(除了这个页面之外,Apple还记录了一些在Xcode中调试代码的令人难以置信的晦涩但有用的技巧,其中一些技巧已经拯救了我好几次。我建议在developer.apple.com上查看this Technical Note -链接跳到关于Cocoa的基础框架的部分)。
编辑:您通常可以在Xcode调试器中跟踪违规对象,但是如果您使用Instruments来帮助您,通常会容易得多。在Xcode中,选择Run→Start With Performance Tool→Object Allocations,您应该能够追踪到问题对象的创建位置。(这将是最好的工作,如果你启用僵尸如上所述。)注意:雪豹增加了一个僵尸工具的仪器,也可以从运行菜单。可能只值29美元!;-)
发布于 2010-11-03 21:32:33
除了Quinn Taylor的回答之外,我还想补充一下我的经验。
在我的一个应用程序中,我必须解析数据并将其保存到核心数据对象中,然后将这些对象显示在视图上。事实上,这个应用运行得很好,根本不会崩溃,直到我试着做一次来回导航的压力测试,试图尽可能快地打开多个视图。应用程序崩溃,并显示上述消息。
我尝试了Quinn在他的答案中提出的所有方法,但仍然找不到确切的原因。
我设置了NSZombieEnabled=YES和NSStackLogging=YES,运行命令shell malloc_history来找出原因,但仍然没有结果。它总是指出我将数据保存到核心数据对象的位置,事实上,我已经检查了那里超过释放的对象上千次,没有什么奇怪的。
使用各种工具(分配、泄漏等)在工具中运行还是没有帮助。启用守卫,Malloc仍然一无所获。
最后的救援:我试图回到从核心数据中获取对象的视图,并向所有这些对象发送保留消息,并注意到这些更改。它解决了问题!
所以,我发现我没有保留一个,这正是原因所在。我只想分享我的经验,这样你的应用程序就有了另一个救星。
发布于 2009-06-11 03:51:59
通过按Cmd+Shift+R打开调试器控制台。
break malloc_error_break
若要在malloc_error_break
函数的开头设置断点,请执行以下操作。
如果想要找出位于地址0x1068310的对象,可以在调试器控制台中键入以下内容:
print-object 0x1068310
当然,您必须在对象仍处于活动状态时执行此操作--如果在执行此操作时对象已被释放,则此操作将不起作用。
https://stackoverflow.com/questions/971249
复制相似问题