iOS& OpenCV:在设备上调试malloc_error_break

时间:2012-03-16 16:53:23

标签: objective-c ios opencv automatic-ref-counting instruments

使用我的应用程序(在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的方法

1 个答案:

答案 0 :(得分:0)

cyberserker,

您的数据正在被自动释放池排放释放。 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(但我对此表示怀疑)。

安德鲁