2012-10-27 2 views
7

私は次のエラーでクラッシュに直面しています:クラッシュCGDataProviderCreateWithCopyOfData:vm_copyに失敗しました:ステータス1

"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; 

} 

答えて

5

kern_return.hヘッダファイルが得られる:

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

これはvm_copy failed: status 1に関連したエラーコードに対応します。 はアドレス[es]がページ境界にある必要があると述べているので、にあると思われます。

はあなたinImage入力画像よりも、同じ歩幅であなたのpiDataバッファを割り当てる必要があり、あなたが適切に整列バッファで動作を確認します:

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

は、その後、あなたの forループ内代わり width*4のこの bytesPerRow値を使用し、すなわち:

iStep = i*bytesPerRow; 

これは(:私はCGImageGetWidth(inImage)widthが同じであることを前提としています)あなたの問題を解決する必要があります。

+0

はい、メモリアライメントの問題でした。私は画像の向きを考慮していませんでした。 CGimageの幅と高さが異なります。これは、あなたが指摘したように、メモリのミスアライメントを引き起こしました返信いただきありがとうございます。 – Jailbroken