2012-10-27 11 views
7

मैं निम्न त्रुटि के साथ एक दुर्घटना का सामना करना पड़ रहा हूँ:क्रैश CGDataProviderCreateWithCopyOfData: vm_copy में विफल रहा है: स्थिति 1

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

मैं कई प्रश्न हैं और आप कर सकते हैं।

  1. vm_copy में स्थिति 1 के लिए क्या खड़ा है?

  2. यह क्रैश तभी होता है जब मैं डेटा प्रतिलिपि के अंदरूनी भाग में ब्रेक पॉइंट सेट करता हूं। और फिर ब्रेकपॉइंट फिर से शुरू करें और हटा दें। यदि कोई ब्रेकपॉइंट नहीं है, तो फ़ंक्शन निष्पादित होता है लेकिन मुझे एक खाली छवि मिलती है। मैं कैसे सुनिश्चित करूं कि यदि मैं ब्रेक पॉइंट सेट नहीं करता हूं, तो ऐसे क्रैश पकड़े जाते हैं और एप्लिकेशन निष्पादन रोकता है?

  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 से संबंधित त्रुटि कोड से मेल खाती है।

मुझे लगता है इस स्मृति संरेखण से संबंधित कोई समस्या है, vm_copy documentation के बाद से कहा गया है कि पता [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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^