2011-12-06 10 views
20

में भ्रामक एन्कोडिंग अपवाद मैं एक साधारण पाठ संपादक के लिए एक NSDocument उपवर्ग (शेर की नया दस्तावेज़ आधारित एप्लिकेशन टेम्पलेट का उपयोग कर, कुछ अनुकूलन के साथ) है, और मैं एक अजीब बग पाठ भंडारण में फ़ाइल सामग्री लोड का सामना कर रहा हूँ।NSTextStorage

- (void)loadTextContentIntoStorage 
{ 
    if (!self.textStorage || !textContentToLoad) 
    return; 

    ... 

    [self.textStorage beginEditing]; 

// NSLog(@"storage: %@ length: %lu textContent: %@", self.textStorage, (unsigned long)self.textStorage.length, textContentToLoad); 
// [self.textStorage replaceCharactersInRange:NSMakeRange(0, self.textStorage.length) withString:textContentToLoad]; 
    [self.textStorage replaceCharactersInRange:NSMakeRange(0, 0) withString:@"hello world"]; 

    .. 

    [self.textStorage endEditing]; 
} 

बग होता है जब मैं:

यहाँ मेरी कोड है

  • Xcode में अनुप्रयोग चलाने के (एक डीबग बिल्ड के रूप में)
  • किसी भी दस्तावेज़
  • एप्लिकेशन से बाहर निकलने को खोलने के (दस्तावेज़ को बन्द करने के)
  • Xcode
  • से फिर अनुप्रयोग चलाने

यह -replaceCharactersInRange:withString: में क्रैश होता है "स्ट्रिंग 0x10004d430 में बाइट्स को _NSCStringEncoding में कनवर्ट करने में असमर्थ"।

लेकिन यह केवल हर दूसरा एप्लिकेशन के लॉन्च पर होता है (एक तिहाई लांच क्रैश नहीं करेंगे, और यह स्वचालित रूप से दस्तावेज़ यह पिछले समय खोलने की कोशिश कर दुर्घटनाग्रस्त हो गया फिर से खुलेगी)। यह तब भी होता है जब मैं एक्सकोड से ऐप चलाता हूं। रिलीज बिल्ड लॉन्च पर कभी दुर्घटनाग्रस्त नहीं हुआ है।

मैंने सोचा कि यह ऑटो-सेव सिस्टम के साथ एक एन्कोडिंग समस्या हो सकती है, लेकिन जब मैं उस कोड पर टिप्पणी करता हूं और टेक्स्ट दृश्य में "हैलो वर्ल्ड" स्ट्रिंग लोड करता हूं (जैसा उपरोक्त कोड में दिखाया गया है) । इसी तरह, NSLog() पर टिप्पणी की गई अजीब कुछ भी नहीं दिखाती है। टेक्स्ट स्टोरेज मान्य है (xib फ़ाइल से लोड किया गया है), टेक्स्ट स्टोरेज लंबाई 0 है, और टेक्स्ट सामग्री फ़ाइल खोलने की सामग्री है।

--- संपादित करें ---

मैं इस समस्या है सीखा है com.apple.security.app-sandbox पात्रता को किसी तरह से संबंधित है। हकों/सैंडबॉक्स हैं सक्षम, तो मेरे ऐप नहीं दुर्घटना करता है। या तो हकों या एप्लिकेशन-सैंडबॉक्स सुविधा विकलांग, तो हर दूसरे पहले से खोले गए दस्तावेज़ों को बहाल करने की कोशिश कर रहा लांच पर अपना ऐप्लिकेशन क्रैश कर रहे हैं।

मैं केवल यह दुर्घटनाग्रस्त जब एक निर्माण/xcode के भीतर से चला कर रही है, क्योंकि उस सैंडबॉक्स अक्षम के साथ अपने ही निर्माण विन्यास था देखा था।

---/संपादित करें ---

किसी को भी किसी भी विचार है? पूर्ण अपवाद है, और पूर्ण स्रोत कोड GitHub पर है: https://github.com/abhibeckert/Dux/blob/master/Dux/DuxTextView.m

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to convert bytes in string 0x10004d430 to _NSCStringEncoding' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff84afb286 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff88991d5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff84afb0ba +[NSException raise:format:arguments:] + 106 
    3 CoreFoundation      0x00007fff84afb044 +[NSException raise:format:] + 116 
    4 Foundation       0x00007fff835bfae4 copyFromStringToStorage + 262 
    5 Foundation       0x00007fff835bf979 -[NSBigMutableString replaceCharactersInRange:withString:] + 1000 
    6 Foundation       0x00007fff835bc3f7 -[NSConcreteMutableAttributedString replaceCharactersInRange:withString:] + 375 
    7 AppKit        0x00007fff86149e14 -[NSConcreteTextStorage replaceCharactersInRange:withString:] + 81 
    8 Dux         0x0000000100002f9a -[MyTextDocument loadTextContentIntoStorage] + 1338 
    9 Dux         0x00000001000022a0 -[MyTextDocument windowControllerDidLoadNib:] + 640 
    10 AppKit        0x00007fff860f1328 -[NSWindowController _windowDidLoad] + 667 
    11 AppKit        0x00007fff860e89a3 -[NSWindowController window] + 109 
    12 AppKit        0x00007fff8615d761 -[NSDocument windowForSheet] + 86 
    13 AppKit        0x00007fff860e82c4 -[NSDocument _shouldShowAutosaveButtonForWindow:] + 50 
    14 AppKit        0x00007fff860e7fbb -[NSWindowController setDocument:] + 237 
    15 AppKit        0x00007fff8629c9b6 -[NSDocument makeWindowControllers] + 139 
    16 AppKit        0x00007fff8615d555 -[NSDocument(NSPersistentUISupport) restoreDocumentWindowWithIdentifier:state:completionHandler:] + 90 
    17 AppKit        0x00007fff8615d4aa -[NSDocumentControllerPersistentRestoration loadedDocument:forAutoID:] + 179 
    18 AppKit        0x00007fff8615cfbe __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_8 + 187 
    19 AppKit        0x00007fff86148e14 __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_5 + 163 
    20 AppKit        0x00007fff86148d5f __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_4 + 697 
    21 AppKit        0x00007fff86148aa1 -[NSDocumentController _openDocumentWithContentsOfURL:usingProcedure:] + 530 
    22 AppKit        0x00007fff8614868d __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_3 + 242 
    23 libdispatch.dylib     0x00007fff8bbbe8ba _dispatch_call_block_and_release + 18 
    24 libdispatch.dylib     0x00007fff8bbc072a _dispatch_main_queue_callback_4CF + 308 
    25 CoreFoundation      0x00007fff84a904dc __CFRunLoopRun + 1724 
    26 CoreFoundation      0x00007fff84a8fae6 CFRunLoopRunSpecific + 230 
    27 HIToolbox       0x00007fff8852f3d3 RunCurrentEventLoopInMode + 277 
    28 HIToolbox       0x00007fff8853663d ReceiveNextEventCommon + 355 
    29 HIToolbox       0x00007fff885364ca BlockUntilNextEventMatchingListInMode + 62 
    30 AppKit        0x00007fff85ef23f1 _DPSNextEvent + 659 
    31 AppKit        0x00007fff85ef1cf5 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135 
    32 AppKit        0x00007fff85eee62d -[NSApplication run] + 470 
    33 AppKit        0x00007fff8616d80c NSApplicationMain + 867 
    34 Dux         0x0000000100001e32 main + 34 
    35 Dux         0x0000000100001e04 start + 52 
    36 ???         0x0000000000000003 0x0 + 3 
) 
+0

आप * मेमोरी भ्रष्टाचार कर सकते हैं। क्या आपने XCode में उपलब्ध स्मृति स्थिरता उपकरण चलाने का प्रयास किया है? (बिल्ड और विश्लेषण, लाश, और जैसे) – voidref

+0

हां, मैंने निर्माण और विश्लेषण करने की कोशिश की है, और लाश सक्षम हैं। मैं एआरसी का भी उपयोग कर रहा हूं। –

+0

मैं गया और आपकी परियोजना मिली क्योंकि यह आकर्षक है। मैंने स्क्रिबल गार्ड और यह सब सक्षम किया, अभी भी कुछ भी गलत नहीं दिख रहा है। विश्लेषक दिखाते हैं कि कई वैध चिंताओं हैं, लेकिन उन्हें ठीक करने से इस समस्या को प्रभावित नहीं हुआ है। – voidref

उत्तर

0

ऐसा लगता है कि यह ओएस एक्स 10.7 (शेर) में एक बग रहा है। मेरे कोड में शून्य परिवर्तन के साथ, ओएस एक्स 10.8 (माउंटेन शेर) पर क्रैश संख्या अब एक्सकोड 4.4.1 के साथ अनुपालन नहीं होती है।

+0

मैं ओएस एक्स 10.9.1 पर एक्सकोड 5.0.2 में अपनी परियोजनाओं में से एक के साथ इस मुद्दे को देख रहा हूं। मुझे यह जानकर उत्सुकता है कि क्या यह आपके लिए कभी भी पुनर्जीवित है? –

+0

@ चार्ल्स ए। यह मेरे लिए पुनरुत्थान नहीं हुआ है, लेकिन शायद एक ही लक्षण को ट्रिगर करने के अन्य तरीके हैं। –

5

मैं मानता हूं, इस सवाल का काफी कुछ समय के लिए मुझे स्टम्प्ड। मुझे लगता है कि आखिरकार मुझे एक रेपो मिला है, हालांकि।जाहिर है

if (enc == NSASCIIStringEncoding 
    && isByteEncoding(internalEncoding)) 
    { 
     unsigned i; 

     if (bytes > self->_count) 
    { 
     bytes = self->_count; 
    } 
     for (i = 0; i < bytes; i++) 
    { 
     unsigned char c = self->_contents.c[i]; 

     if (c > 127) 
     { 
      [NSException raise: NSCharacterConversionException 
       format: @"unable to convert to encoding"]; 
     } 
     buffer[i] = c; 
    } 
     buffer[bytes] = '\0'; 
     if (bytes < self->_count) 
    { 
     return NO; 
    } 
     return YES; 
    } 
... 

, इस कोड को एक-से-एक अपने त्रुटि संदेश के साथ नहीं है:

GNUstepcode that emulates this behavior के माध्यम से देख रहे हैं, मैं निम्नलिखित स्रोत कोड मिल गया। हालांकि, मैं यही आपकी त्रुटि रेप्रो से ध्यान दें:

reason: 'Unable to convert bytes in string 0x10004d430 to_NSCStringEncoding'

खैर, we all know what a C String is, और यदि आप गलत एन्कोडिंग विधि (उदाहरण के लिए उपयोग करते हैं, वाइड जहां ASCII की उम्मीद है या इसके विपरीत), आप वास्तव में इस समस्या के साथ खत्म होने जा रहे हैं। इस प्रकार: क्या आपने इस मुद्दे को ठीक करने के लिए अपने आवेदन में अलग-अलग ASCII और विस्तृत डेटा प्रकारों का प्रयास किया है?

यह व्यवहार कितना आम होता है, यह बहुत संभवतः इंगित करता है कि यह एप्लिकेशन सैंडबॉक्स द्वारा एक संभाला गया मामला है। हालांकि, मुझे इस प्रभाव में अभी तक दस्तावेज नहीं मिल रहा है। यह कुछ स्पष्ट रूप से sandboxd द्वारा नोट किया जाना चाहिए, जैसा कि मैंने प्रश्न इरेटा में उठाया था।

+1

ठीक है, अभिी ने अभी तक जवाब नहीं दिया है कि क्या यह समस्या का कारण बनता है, लेकिन मेरा बक्षीस समाप्त होने वाला है, और आपका जवाब अच्छी तरह से सोचा गया है और कम से कम सहायक है, इसलिए मैं आपको बक्षीस देने के लिए जा रहा हूं। –

+0

सहायता के लिए धन्यवाद, जब मैं अतिरिक्त मिनट प्राप्त करता हूं तो मैं इसमें देखता हूं। यद्यपि बहुत आशावादी नहीं है, क्योंकि क्रैश तब भी होता है जब मैं एक हार्ड कोडित @ "हैलो वर्ल्ड" स्ट्रिंग को फ़ील्ड में स्थिर करता हूं, न कि जब मैं किसी फ़ाइल से स्ट्रिंग पढ़ता हूं।मेरा डीबग करने का मेरा अगला विचार यह है कि अपवाद मैं स्ट्रिंग * के बारे में बात नहीं कर रहा हूं * लेकिन स्ट्रिंग ऑब्जेक्ट जो पहले से ही टेक्स्ट फ़ील्ड में है, को नए मान से बदल दिया जा रहा है। कोको का ऑटो-सेव कुछ अजीब कर रहा है? मेरे पास प्रयोग करने का समय नहीं है। –

+0

मुझे यह देखने में दिलचस्पी होगी कि यह क्या हो रहा है। मैंने इसे सहिष्णु रूप से दस्तावेज के रूप में पीछे छोड़ दिया है, लेकिन मैं कल्पना कर सकता हूं कि यह चीज़ एक्सकोड में फेंक दे और देखें कि क्या होता है। मुझे उम्मीद है कि यह एक साधारण चरित्र एन्कोडिंग समस्या होगी, लेकिन _where_ और _why_ यहां सबसे महत्वपूर्ण है। – MrGomez

1

मुझे 10.9.2 पर एक ही अपवाद मिला।

Unable to convert bytes in string 0x60800026cd40 to _NSCStringEncoding 
(
    0 CoreFoundation      0x00007fff8dec825c __exceptionPreprocess + 172 
    1 libobjc.A.dylib      0x00007fff81de0e75 objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff8dec810c +[NSException raise:format:] + 204 
    3 Foundation       0x00007fff8d94dd2b copyFromStringToStorage + 223 
    4 Foundation       0x00007fff8d94db9e -[NSBigMutableString replaceCharactersInRange:withString:] + 1081 
    5 Foundation       0x00007fff8d94d738 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 296 
    6 AppKit        0x00007fff88d7889c -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 77 
    9 myApp       0x00000001035d3fff myApp + 12287 
    10 CoreFoundation      0x00007fff8de96e0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12 
    11 CoreFoundation      0x00007fff8dd8a82d _CFXNotificationPost + 2893 
    12 Foundation       0x00007fff8d8f8e4a -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 
    13 AppKit        0x00007fff88b99cde -[NSApplication finishLaunching] + 440 
    14 AppKit        0x00007fff88b997f3 -[NSApplication run] + 128 
    15 AppKit        0x00007fff88b84783 NSApplicationMain + 940 
    16 libdyld.dylib      0x00007fff81aa65fd start + 1 
    17 ???         0x0000000000000001 0x0 + 1 
) 

मैं applicationWillFinishLaunching में NSTextStorage का उपयोग कर रहा था। मैंने इसे applicationDidFinishLaunching पर ले जाया है और यह ठीक काम कर रहा है।