CGDataProviderCreateWithCopyOfData崩溃:vm_copy失败:状态1。该问题涉及IT技术。

8
我遇到了以下错误导致应用崩溃:

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

我有几个问题需要帮忙解答:
  1. 在vm_copy失败中,状态1代表什么意思?

  2. 当我在数据复制的内部for循环中设置断点后恢复并删除断点时,才会发生此崩溃。如果没有断点,函数将执行但是我得到一个空白图像。如何确保即使我没有设置断点,也能捕获这样的崩溃并停止应用程序的执行?

  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个回答

5

kern_return.h头文件提供:

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

这对应于与vm_copy失败:状态1相关的错误代码。
我怀疑这是与内存对齐有关的问题,因为vm_copy文档指出地址必须在页面边界上
为了确保您使用正确对齐的缓冲区,您应该使用与输入图像inImage相同的步幅来分配piData缓冲区。
size_t bytesPerRow = CGImageGetBytesPerRow(inImage);
UInt8*piData = calloc(bytesPerRow*height,sizeof(UInt8));

然后在你的for循环中,使用这个bytesPerRow值代替width*4,即:

iStep = i*bytesPerRow;

这应该解决你的问题(注意:我假设CGImageGetWidth(inImage)width是相同的)。

是的,这是内存对齐问题。我没有考虑图像方向,导致CGimage的宽度和高度不同。这导致了内存错位,正如你所指出的那样。感谢您的回复。 - TorukMakto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接