如何找到malloc"双重免费"错误的原因?

gon*_*nso 80 iphone malloc memory-management objective-c autorelease

我在Objective-C中编写应用程序,我收到此错误:

MyApp(2121,0xb0185000)malloc:***对象0x1068310的错误:double free
***在malloc_error_break中设置断点以进行调试

当我发布一个NSAutoreleasePool并且我无法弄清楚我要发布两次的对象时,就会发生这种情况.

我该如何设置他的断点?

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

Qui*_*lor 45

当一个对象被"双重释放"时,最常见的原因是你(不必要地)释放了一个自动释放的对象,并且当包含的自动释放池被清空时,它会在以后自动释放.

我发现追踪额外版本的最佳方法是在Xcode中使用NSZombieEnabled环境变量来处理受影响的可执行文件.有关如何使用它的快速概述,请查看此CocoaDev wiki页面.(除了这个页面之外,Apple已经记录了一些非常模糊但有用的技巧,用于调试Xcode中的代码,其中一些已经保存了我的培根几次.我建议在developer.apple.com上查看这篇技术说明 - 链接跳转到Cocoa的Foundation框架部分).

编辑:您经常可以在Xcode调试器中跟踪有问题的对象,但如果您使用Instruments来帮助您,通常会更容易.从Xcode中选择Run→Start With Performance Tool→Object Allocations,您应该能够将违规对象追溯到创建它的位置.(如果你已经启用了僵尸,这将最有效.如上所述.)注意: Snow Leopard将一个Zombies工具添加到Instruments,也可以从Run菜单访问.可能值得单独29美元!;-)

这里还有一个相关的SO问题.


Fra*_*ger 37

在调试器中断时,您将找到对象是什么.只需查看调用堆栈,您就会找到释放它的位置.那将告诉你它是哪个对象.

设置断点的最简单方法是:

  1. 转到运行 - >显示 - >断点(ALT- Command- B)
  2. 滚动到列表底部并添加符号 malloc_error_break

  • @gonso - 只是好奇,如果这不适合你,为什么你接受它作为答案? (58认同)
  • 在Xcode 4.3.2中,断点可以在**视图→导航器→显示断点导航器**或⌘6(Cmd-6)中找到 (7认同)
  • 没有任何帮助自动释放双免费.他需要僵尸 (3认同)

Hoa*_*ham 12

除了Quinn Taylor的答案之外,我只想补充一下我的经验.

在我的一个应用程序中,我必须解析并将数据保存到核心数据对象中,然后将这些对象显示在视图上.事实上,应用程序工作得很好,并且根本没有崩溃,直到我尝试进行多次来回导航的压力测试,试图尽可能快地打开多个视图.该应用程序崩溃与上述消息.

我已经尝试了Quinn在他的回答中提出的所有方法,但仍未找出究竟原因在哪里.

我设置NSZombieEnabled = YES,并且NSStackLogging = YES,运行命令shell malloc_history找出原因,但仍然没有运气.它总是指出我将数据保存到核心数据对象的位置,事实上,我已经检查过数千次过度释放的对象,没什么奇怪的.

使用各种工具(分配,泄漏等)在仪器中运行仍然无济于事.启用Guard Malloc仍然一无所获.

最终救援:我试图回到从Core Data中获取对象的视图,并向所有这些对象发送保留消息,并注意到这些更改.它解决了这个问题!

所以,我发现我没有保留一个,这正是原因.只想分享我的经验,以便为您的应用程序再次提供帮助.


Ada*_*eld 9

按Cmd + Shift + R打开调试器控制台.那里,打字

break malloc_error_break
Run Code Online (Sandbox Code Playgroud)

malloc_error_break函数的开头设置断点.

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

print-object 0x1068310
Run Code Online (Sandbox Code Playgroud)

当然,你必须在对象仍然存活时执行此操作 - 如果对象在你执行此操作时已经被释放,那么这将无效.


Ram*_*rma 8

请参阅以下步骤,了解如何查找空闲对象并使应用程序崩溃。

1) 单击“断点导航器”。
2)然后点击下面的“ + ”按钮。3)从列表中
添加“符号断点... ”。4)在“ Symbol
”选项上添加“ malloc_error_break ”关键字。

或者您也可以参考下面的 GIF 演示。

GIF 表示