iOS & OpenCV:在设备上调试 malloc_error_break

Posted

技术标签:

【中文标题】iOS & OpenCV:在设备上调试 malloc_error_break【英文标题】:iOS & OpenCV : debug malloc_error_break on device 【发布时间】:2012-03-16 16:53:23 【问题描述】:

使用我的应用程序时出现此错误(在 ARC 下)

(816,0x2ffe0000) malloc: *** error for object 0xb185010: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

所以我设置了一个 malloc_error_break 断点,并没有得到任何额外的信息到控制台。 我将 bt 添加到控制台并获得

(gdb) bt
#0  0x3635117c in malloc_error_break ()
#1  0x362dd924 in free ()
#2  0x31d64588 in -[NSConcreteData dealloc] ()
#3  0x319a50c4 in _objc_rootRelease ()
#4  0x319a6db6 in objc_release ()
#5  0x319a5e0c in (anonymous namespace)::AutoreleasePoolPage::pop ()
#6  0x319a5d28 in _objc_autoreleasePoolPop ()
#7  0x37e13e8e in _CFAutoreleasePoolPop ()
#8  0x37b818e6 in _dispatch_worker_thread2 ()
#9  0x362e61ce in _pthread_wqthread ()
#10 0x362e60a4 in start_wqthread ()

错误出现在不同的时间,不同的用法,我找不到涉及的代码。 知道如何调试(仅在设备上,我使用 AVCaptureSession)。

编辑

我认为它来自

NSData *data = [NSData dataWithBytesNoCopy:cvMat.data
                                    length:(cvMat.elemSize() * cvMat.total())
                              freeWhenDone:YES];

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

通过这段代码,我限制了内存分配

Instruments With No Copy

如果我把它改成

NSData *data = [NSData dataWithBytes:cvMat.data
                                  length:(cvMat.elemSize() * cvMat.total())];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

我得到了一个看起来像 AutoReleasePool 的奇怪东西

Instruments With Copy

错误可能是由于代码中某个对象的自动释放造成的吗?

*取自 Robin Summerhill 的方法

【问题讨论】:

我觉得和***.com/questions/2257435/…和iphonedevsdk.com/forum/iphone-sdk-development/…类似 已经看过这些链接了。不幸的是,malloc_error_break 和 NSZombies 无法在设备上运行! 【参考方案1】:

网民,

您的数据正在被自动释放池耗尽释放。 CGDataProviderCreateWithCFData() 似乎没有保留您的数据项。更改此行为的最简单方法是使用 init 表单创建 data。如:

int *dataBytes = malloc(20);
NSData *data = [[NSData alloc] initWithBytesNoCopy:dataBytes
                                            length:20
                                      freeWhenDone:YES];

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge_retained CFDataRef)data);

当你最终释放provider 时,你可能还必须释放CFData(但我对此表示怀疑)。

安德鲁

【讨论】:

@adonho。我尝试了您的解决方案,它似乎不再调用自动释放池。我不明白为什么在 ARC 下这个工厂方法返回一个进入 autoreleasepool 的对象?我没有发布 CFData(如果我这样做了,来自 Analyzer 的投诉),但应用程序继续崩溃。一直在调查中...... 网络用户,ARC 不会更改返回对象的保留规则。 Cocoa 中的大多数对象仍然是自动释放的,而不是 ARC 释放的。 W.r.t.您的崩溃,我假设上面的自动释放跟踪现在无效。它到底在哪里崩溃?你到底在哪里发布provider?安德鲁 @adonho。感谢您提供有关 ARC 的这些信息。我必须更新很多代码,因为自 ARC 以来我主要使用工厂!我已将 Xcode 更新到 4.3.1,现在使用 LLDB。现在,分析器说我必须发布数据?这就是我所做的:CFDataRef dataRef = (__bridge_retained CFDataRef)data; CGDataProviderRef provider = CGDataProviderCreateWithCFData(dataRef); CFRelease(dataRef); 现在似乎一切正常(需要长期运行才能确定)。我可能永远不会明白问题出在哪里(Xcode 4.2、GCD、我?)。我想给你投票,但我目前不能,抱歉。

以上是关于iOS & OpenCV:在设备上调试 malloc_error_break的主要内容,如果未能解决你的问题,请参考以下文章

无法安装代号一 iOS 调试应用程序

调试设备上的iOS / AIR内容

如何调试未在任何 IOS 设备上加载的网站?

iOS 应用程序在设备上启动后连接调试器时冻结在空白屏幕上

Xamarin.iOS 为啥在设备上调试时 HKAnchoredObjectQuery 处于非活动状态然后停用?

Xamarin.iOS 为啥在设备上调试时 HKAnchoredObjectQuery 处于非活动状态然后停用?