2012-10-27 17 views
7

jestem w obliczu katastrofy z następującym błędem:crash CGDataProviderCreateWithCopyOfData: vm_copy failed: Status 1

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

Mam wiele pytań, a może pomóc.

  1. Co oznacza status 1 w vm_copy?

  2. Ta awaria ma miejsce tylko wtedy, gdy ustawiam punkt przerwania wewnętrznej pętli danych. A następnie wznów i usuń punkt przerwania. Jeśli nie ma punktu przerwania, funkcja jest wykonywana, ale pojawia się pusty obraz. Jak mogę się upewnić, że nawet jeśli nie ustawię punktu przerwania, takie awarie zostaną przechwycone, a aplikacja przestanie wykonywać?

  3. Ten błąd pojawia się, gdy wykonuję CGBitmapContextCreateImage. Czy ktoś wie, jak rozwiązać ten problem?

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

} 

Odpowiedz

5

Plik nagłówka kern_return.h daje:

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

Odpowiada to kod błędu związanego z vm_copy failed: status 1.

Podejrzewam, że jest to problem związany z dostosowaniem pamięci, ponieważ vm_copy documentation stwierdza, że ​​adres [es] musi znajdować się na stronie granicy.

Aby upewnić się pracować z odpowiednio ustawionych bufory, należy przeznaczyć swój bufor piData z takim samym spokojem niż inImage obrazu wejściowego:

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

Następnie użyć tego bytesPerRow wartość zamiast width*4 obrębie pętli for, tj:

iStep = i*bytesPerRow; 

To powinno rozwiązać problem (UWAGA: Zakładam, że CGImageGetWidth(inImage) i width są takie same).

+0

Tak, to był problem z wyrównaniem pamięci. Nie brałem pod uwagę orientacji obrazu. Który dał inną szerokość i wysokość dla CGimage. To, co zauważyłeś, spowodowało nieprawidłowe ustawienie pamięci. Dziękuję za odpowiedź. – Jailbroken