2012-10-27 7 views
7

나는 다음과 같은 오류와 충돌에 직면하고있다 :충돌 CGDataProviderCreateWithCopyOfData : vm_copy 실패 : 상태 1

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

는 여러 개의 질문이 당신이 도움이 될 수 있습니다.

  1. 상태 1은 vm_copy에서 무엇을 의미합니까?

  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*4bytesPerRow 값을 사용, 예 :

iStep = i*bytesPerRow; 

이 문제 (: 나는 CGImageGetWidth(inImage)width이 동일한 지 가정합니다)를 해결해야한다.

+0

예 메모리 정렬 문제였습니다. 이미지 방향을 고려하지 않았습니다. CGimage의 너비와 높이가 서로 다릅니다. 이로 인해 지적한대로 메모리 정렬이 잘못되었습니다. 답장을 보내 주셔서 감사합니다. – Jailbroken