Сбой CGDataProviderCreateWithCopyOfData: ошибка vm_copy: состояние 1

Я столкнулся с аварией со следующей ошибкой:

"CGDataProviderCreateWithCopyOfData: ошибка vm_copy: статус 1."

У меня есть несколько вопросов, и вы можете помочь.

  1. Что означает сбой статуса 1 в vm_copy?

  2. Этот сбой происходит только тогда, когда я устанавливаю точку останова во внутреннем цикле копирования данных. А затем возобновите и удалите точку останова. Если точки останова нет, функция выполняется, но я получаю пустое изображение. Как я могу гарантировать, что даже если я не установлю точку останова, такие сбои будут обнаружены, и приложение остановит выполнение?

  3. Эта ошибка возникает, когда я выполняю CGBitmapContextCreateImage. Кто-нибудь знает, как решить эту проблему?

-(UIImage *) convertBitmapRGBA8ToUIImage:(UInt8**)img 
                                    :(int) width
                                    :(int) height 
{

CGImageRef inImage = m_inFace.img.CGImage;

UInt8*piData = calloc( width*height*4,sizeof(UInt8));

int iStep,jStep;
for (int i = 0; i < height; i++) 
{
    iStep = i*width*4;
    for (int j = 0; j < width; j++) 
    {
        jStep = j*4;
        piData[iStep+jStep] =img[i][j];
        piData[iStep+jStep+1] =img[i][j];
        piData[iStep+jStep+2] = img[i][j];

    }
}

CGContextRef ctx = CGBitmapContextCreate(piData,
                                         CGImageGetWidth(inImage),  
                                         CGImageGetHeight(inImage),  
                                         CGImageGetBitsPerComponent(inImage),
                                         CGImageGetBytesPerRow(inImage),  
                                         CGImageGetColorSpace(inImage),  
                                         CGImageGetBitmapInfo(inImage) 
                                         ); 

CGImageRef imageRef = CGBitmapContextCreateImage(ctx);  
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGContextRelease(ctx);
CGImageRelease(imageRef);
free(piData);
return finalImage;

}

1 ответ

Решение

Заголовочный файл kern_return.h дает:

#define KERN_INVALID_ADDRESS        1
  /* Specified address is not currently valid.
   */

Это соответствует коду ошибки, связанному с vm_copy failed: status 1,

Я подозреваю, что это проблема, связанная с выравниванием памяти, поскольку в документации vm_copy указано, что адрес [es] должен быть на границе страницы.

Чтобы убедиться, что вы работаете с правильно выровненными буферами, вы должны выделить piData буфер с тем же шагом, чем ваш inImage входное изображение:

size_t bytesPerRow = CGImageGetBytesPerRow(inImage);
UInt8*piData = calloc(bytesPerRow*height,sizeof(UInt8));

Тогда используйте это bytesPerRow значение вместо width*4 в вашем for петля, то есть:

iStep = i*bytesPerRow;

Это должно решить вашу проблему (Примечание: я предполагаю, что CGImageGetWidth(inImage) а также width подобные).

Другие вопросы по тегам