双重释放***在ARC中设置malloc_error_break断点进行调试

4

我在我的应用程序中使用了ARC,并且与核心数据和线程等相关,经过所有艰苦的努力使核心数据与线程一起运作而不崩溃,现在我遇到了一个新的问题,出现了以下错误-

double free*** set a breakpoint in malloc_error_break to debug

我该如何处理这个问题?我无法控制对象的保留计数。


这与对象的保留计数无关。这个消息是glibc内置的错误消息之一。这个特定的消息指出,您已经明确地在同一内存区域上两次使用了free()。 - user529758
我没有做过类似于free()或malloc()的任何事情。 - Yogesh Maheshwari
那你能否提供更多的调试信息呢?比如更多的错误消息,也许你应该使用-g编译,并在gdb中执行回溯等。否则我们真的无法帮助... - user529758
@H2CO3,你说的获取回溯信息的方法是什么? - Yogesh Maheshwari
当我从一个基类继承时,如果我忘记将析构函数标记为“virtual”,就会出现类似的错误(C++ 代码段)。 - bobobobo
显示剩余2条评论
2个回答

8

仅限于测试目的使用。在构建时,请删除引用!! - Naveen Thunga
那个链接似乎无法访问(加载不出来)。你能否给一些见解,告诉我需要做什么?我以前用过Zombies,但并不是很深入。@NaveenThunga(谢谢!) - owen gerig

1

如果你想知道是谁破坏了分配:

简单地按照消息所示进行中断将给你线索。

如果你想知道是谁创建了分配:

虽然你也可以使用malloc堆栈日志从命令行完成这个操作,但使用Instruments可能会更加温和。在Instruments中启用分配记录并运行程序,重现问题,然后在Instruments中查找双重释放的地址——它将显示分配创建的回溯。然后找出为什么该分配被释放两次。


你能分享一下添加malloc_error_break断点的步骤吗? - Kudit
@Gujamin 我怀疑你没有先搜索 -- 我在 Stack Overflow 上输入了 malloc_error_break。第一个结果回答了你的问题(逐步):https://dev59.com/0Gw05IYBdhLWcg3w9mZW - justin
我已经按照那些步骤(添加malloc_error_break符号断点)进行了操作,但它并没有停在我的代码中的任何地方,而是再次报告了 *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug - Kudit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接