8

次のエラーでクラッシュに直面しています:

「CGDataProviderCreateWithCopyOfData:vm_copy failed:status1.」

複数の質問がありますので、お役に立てれば幸いです。

  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;

}
4

1 に答える 1

5

kern_return.hヘッダーファイルは次のようになります。

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

これは、に関連するエラーコードに対応しますvm_copy failed: status 1

vm_copyのドキュメントには、アドレスはページ境界上にある必要があると記載されているため、これはメモリアライメントに関連する問題だと思います。

適切に配置されたバッファで作業することを確認するには、入力イメージpiDataと同じストライドでバッファを割り当てる必要があります。inImage

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

次に、ループ内でbytesPerRowはなく、この値を使用します。width*4for

iStep = i*bytesPerRow;

これで問題が解決するはずです(注:CGImageGetWidth(inImage)widthは同じだと思います)。

于 2012-10-28T10:58:57.177 に答える