Сбой CGDataProviderCreateWithCopyOfData: ошибка vm_copy: состояние 1
Я столкнулся с аварией со следующей ошибкой:
"CGDataProviderCreateWithCopyOfData: ошибка vm_copy: статус 1."
У меня есть несколько вопросов, и вы можете помочь.
Что означает сбой статуса 1 в vm_copy?
Этот сбой происходит только тогда, когда я устанавливаю точку останова во внутреннем цикле копирования данных. А затем возобновите и удалите точку останова. Если точки останова нет, функция выполняется, но я получаю пустое изображение. Как я могу гарантировать, что даже если я не установлю точку останова, такие сбои будут обнаружены, и приложение остановит выполнение?
Эта ошибка возникает, когда я выполняю 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
подобные).