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
在调试器中断时,您将找到对象是什么.只需查看调用堆栈,您就会找到释放它的位置.那将告诉你它是哪个对象.
设置断点的最简单方法是:
- 转到运行 - >显示 - >断点(ALT- Command- B)
- 滚动到列表底部并添加符号
malloc_error_break
Hoa*_*ham 12
除了Quinn Taylor的答案之外,我只想补充一下我的经验.
在我的一个应用程序中,我必须解析并将数据保存到核心数据对象中,然后将这些对象显示在视图上.事实上,应用程序工作得很好,并且根本没有崩溃,直到我尝试进行多次来回导航的压力测试,试图尽可能快地打开多个视图.该应用程序崩溃与上述消息.
我已经尝试了Quinn在他的回答中提出的所有方法,但仍未找出究竟原因在哪里.
我设置NSZombieEnabled = YES,并且NSStackLogging = YES,运行命令shell malloc_history找出原因,但仍然没有运气.它总是指出我将数据保存到核心数据对象的位置,事实上,我已经检查过数千次过度释放的对象,没什么奇怪的.
使用各种工具(分配,泄漏等)在仪器中运行仍然无济于事.启用Guard Malloc仍然一无所获.
最终救援:我试图回到从Core Data中获取对象的视图,并向所有这些对象发送保留消息,并注意到这些更改.它解决了这个问题!
所以,我发现我没有保留一个,这正是原因.只想分享我的经验,以便为您的应用程序再次提供帮助.
按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)
当然,你必须在对象仍然存活时执行此操作 - 如果对象在你执行此操作时已经被释放,那么这将无效.
请参阅以下步骤,了解如何查找空闲对象并使应用程序崩溃。
1) 单击“断点导航器”。
2)然后点击下面的“ + ”按钮。3)从列表中
添加“符号断点... ”。4)在“ Symbol
”选项上添加“ malloc_error_break ”关键字。
或者您也可以参考下面的 GIF 演示。
| 归档时间: |
|
| 查看次数: |
73133 次 |
| 最近记录: |