2012-10-27 11 views
7

Ich bin einen Absturz mit folgendem Fehler auftritt:Absturz CGDataProviderCreateWithCopyOfData: vm_copy fehlgeschlagen: Status 1

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

Ich habe mehrere Fragen, und Sie können sie dabei helfen.

  1. Wofür steht der Status 1 in vm_copy?

  2. Dieser Absturz passiert nur, wenn ich einen Unterbrechungspunkt in der inneren for-Schleife der Datenkopie setze. Und dann wieder aufnehmen und entfernen Sie den Haltepunkt. Wenn es keinen Haltepunkt gibt, wird die Funktion ausgeführt, aber ich erhalte ein leeres Bild. Wie stelle ich sicher, dass solche Abstürze auch dann aufgefangen werden, wenn ich keinen Unterbrechungspunkt festlege, und die Anwendung die Ausführung stoppt?

  3. Dieser Fehler tritt auf, wenn ich CGBitmapContextCreateImage ausführe. Weiß jemand, wie man das löst?

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

} 

Antwort

5

Die kern_return.h Header-Datei gibt:

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

Dies ist auf die zu vm_copy failed: status 1 bezogenen Fehlercode entspricht.

Ich vermute, das ist ein Problem im Zusammenhang mit Speicherausrichtung, da die vm_copy documentation besagt, dass Adresse [es] auf einer Seitengrenze sein muss.

Um sicherzustellen, dass Sie mit richtig ausgerichtet Puffer arbeiten, können Sie Ihre piData Puffer mit dem gleichen Schritt als Ihr inImage Eingangsbild zuweisen soll:

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

Dann verwenden Sie diesen bytesPerRow Wert statt width*4 innerhalb Ihrer for Schleife, dh:

iStep = i*bytesPerRow; 

Dies sollte Ihr Problem lösen (Anmerkung: ich gehe davon aus, dass CGImageGetWidth(inImage) und width gleich sind).

+0

Ja, es war Speicherausrichtungsproblem. Ich habe keine Bildorientierung in Betracht gezogen. Das gab unterschiedliche Breite und Höhe für CGimage. Das hat zu einer Speicherfehlersynchronisierung geführt, wie Sie darauf hingewiesen haben. Danke für die Antwort. – Jailbroken

Verwandte Themen