如何findmalloc“double free”错误的原因?

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

MyApp(2121,0xb0185000)malloc:***错误对象0x1068310:双倍空闲
***在malloc_error_break中设置一个断点来进行debugging

这是发生在我释放一个NSAutoreleasePool时,我无法弄清楚我释放两次什么对象。

我如何设置他的断点?

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

当你在debugging器中断时,你会发现对象是什么。 只要看看调用堆栈,你会发现你的空间。 这将告诉你它是哪个对象。

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

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

当一个对象被“双重释放”的时候,最常见的原因是你(不必要地)释放一个自动释放的对象,并且当包含的自动释放池被清空时它会被自动释放。

我发现跟踪额外版本的最好方法是在Xcode中为受影响的可执行文件使用NSZombieEnabled环境variables。 有关如何使用它的简要说明,请查看此CocoaDev wiki页面 。 (除了这个页面,Apple还logging了一些令人难以置信的晦涩而有用的提示,用于在Xcode中debugging代码,其中一些已经保存了我的培根超过了几次,我build议查看关于developer.apple.com的技术说明 – 链接跳转到Cocoa's Foundation框架部分)。

编辑:您可以经常在Xcodedebugging器中跟踪违规对象,但如果使用Instruments来帮助您,则通常会更容易。 从Xcode,select运行→性能工具开始→对象分配 ,你应该能够追溯到有问题的对象回到它创build的地方。 (如上所述,如果你启用了僵尸,这种方法效果最好。) 注意:雪豹在仪器上增加了一个僵尸工具,可以从运行菜单进入。 可能只值29美元! 😉

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

除了奎恩·泰勒的回答之外,我只想补充一下我的经验。

在我的一个应用程序中,我必须parsing数据并将其保存到核心数据对象中,稍后将这些对象显示在视图上。 事实上,应用程序工作正常,并没有崩溃,直到我试图做一个来回导航多次的压力testing,试图尽可能快地打开多个视图。 该应用程序与上述消息崩溃。

我已经尝试了奎因在答案中提出的所有方法,但仍然没有find确切的原因。

我设置NSZombieEnabled = YES和NSStackLogging = YES,运行命令shell malloc_history找出原因,但仍然没有运气。 它总是指出我将数据保存到核心数据对象的地方,事实上,我已经检查了一千多倍的释放对象,没有什么奇怪的。

用各种工具(分配,泄漏等)在仪器上运行仍然没有帮助。 启用Guard Malloc仍然没有任何东西。

最后的救援:我试图回到核心数据中的对象的视图,并发送一个保留消息给所有这些对象,并注意到这些变化。 它解决了这个问题!

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

按Cmd + Shift + R打开debugging器控制台。 在那里,input

 break malloc_error_break 

malloc_error_break函数的开头设置一个断点。

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

 print-object 0x1068310 

当然,在对象还活着的时候你必须这么做 – 如果在你这样做的时候对象已经被释放了,那么这将不起作用。

对我来说,这个问题已经被解决了

 (gdb) call (void)_CFAutoreleasePoolPrintPools() 

在撞车之后。 在堆栈顶部的地址是罪魁祸首的地址。 扔了一个retain ,瞧。

日志消息中给出的地址没有让我到任何地方。 它从来没有出现在各种仪器中。 显然是指向已经被释放的一些内部数据的指针。

在Xcode 4中添加一个符号断点

只是一个更新,使这与Xcode 4有关…

从Xcode 4用户指南 :

添加符号断点。 。 。

  1. 在断点导航器的左下angular,单击添加button。
  2. select添加符号断点。
  3. 在符号字段中input符号名称。
  4. 点击完成。

这就是Xcode中断点窗口中malloc_error_break断点的样子。 需要检查框使其工作。

替代文字http://www.martijnthe.nl/wp-content/uploads/2009/08/Afbeelding-1.png

检查你的类并查看dealloc方法。 确保你关心调用[super dealloc].

我有这个完全相同的问题,发现我正在调用[self dealloc] 。 只是不注意。

这通常是由一些督察,如safari或safari预览。 请参阅postpost问题

删除AutoMatically显示Web ….select,将删除此问题。

请注意,只要closuresSafari浏览器或Safari浏览器预览不会消除此问题。 你必须取消Safari和Safari浏览器的预览。

如果这不行,请参考这个答案发布来debugging它。

在safari预览中取消选择自动检查

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

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

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

GIF代表

在Xcode中,点击行号的左边来设置一个断点。 然后,您可以通过执行“构build和debugging”来启动它。

因为内存是iPhone上的商品,所以build议不要让你创build的对象autorelease 。 苹果build议明确调用release

一般来说,要查找这些types的内存和指针问题,您需要针对像Valgrind这样的运行时内存错误检查程序运行代码。 这应该能够指出你的代码做错了很多事情,超出那些导致它崩溃的事情。

Valgrind 可以在OSX上工作 (虽然它表示它是“不支持的,不完整的和错误的”),并且有些黑客可以在iPhone SDK可执行文件上工作。

更好的是,你可以尝试一下仪器,它是XCode的一部分。 有一个在这里运行它的教程。

如果malloc_error_break不帮助…

解决这个错误的最好方法是在打开NSZombies情况下运行仪器 。 当僵尸被发送消息时,仪器会标记你,你可以直接追溯到代码行。

所需的雪豹,虽然是一个救星!

    Interesting Posts