iOS и OpenCV: отладка malloc_error_break на устройстве - PullRequest
1 голос
/ 16 марта 2012

Я получил эту ошибку при использовании моего приложения (под 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);

С помощью этого кода я ограничиваю выделение памяти

Инструменты без копирования

Принимая во внимание, что если я изменю это на

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

Я получил что-то странное, похожее на AutoReleasePool

Инструменты с копией

Может ли ошибка быть вызвана автоматическим выпуском одного из объектов в коде?

* метод взят от Робина Саммерхилла

1 Ответ

0 голосов
/ 17 марта 2012

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 (но я сомневаюсь в этом).

Andrew

...