首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何找到malloc“双重释放”错误的原因?

如何找到malloc“双重释放”错误的原因?
EN

Stack Overflow用户
提问于 2009-06-09 16:49:50
回答 12查看 77.1K关注 0票数 81

我正在用Objective-C编写一个应用程序,我得到了这个错误:

MyApp(2121,0xb0185000) malloc:*对象0x1068310的错误:双重释放

*在malloc_error_break中设置断点进行调试

当我释放一个NSAutoreleasePool,但我不能确定我释放了两次的对象时,就会发生这种情况。

我怎么设置他的断点?

有没有办法知道这个“对象0x1068310”是什么?

EN

回答 12

Stack Overflow用户

发布于 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美元!;-)

还有一个related SO question here

票数 47
EN

Stack Overflow用户

发布于 2010-11-03 21:32:33

除了Quinn Taylor的回答之外,我还想补充一下我的经验。

在我的一个应用程序中,我必须解析数据并将其保存到核心数据对象中,然后将这些对象显示在视图上。事实上,这个应用运行得很好,根本不会崩溃,直到我试着做一次来回导航的压力测试,试图尽可能快地打开多个视图。应用程序崩溃,并显示上述消息。

我尝试了Quinn在他的答案中提出的所有方法,但仍然找不到确切的原因。

我设置了NSZombieEnabled=YES和NSStackLogging=YES,运行命令shell malloc_history来找出原因,但仍然没有结果。它总是指出我将数据保存到核心数据对象的位置,事实上,我已经检查了那里超过释放的对象上千次,没有什么奇怪的。

使用各种工具(分配、泄漏等)在工具中运行还是没有帮助。启用守卫,Malloc仍然一无所获。

最后的救援:我试图回到从核心数据中获取对象的视图,并向所有这些对象发送保留消息,并注意到这些更改。它解决了问题!

所以,我发现我没有保留一个,这正是原因所在。我只想分享我的经验,这样你的应用程序就有了另一个救星。

票数 13
EN

Stack Overflow用户

发布于 2009-06-11 03:51:59

通过按Cmd+Shift+R打开调试器控制台。

代码语言:javascript
复制
break malloc_error_break

若要在malloc_error_break函数的开头设置断点,请执行以下操作。

如果想要找出位于地址0x1068310的对象,可以在调试器控制台中键入以下内容:

代码语言:javascript
复制
print-object 0x1068310

当然,您必须在对象仍处于活动状态时执行此操作--如果在执行此操作时对象已被释放,则此操作将不起作用。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/971249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档