2015-03-09 2 views
7

मुझे फाउंडेशन की -[NSData(NSData) getBytes:length:] विधि के अंदर एक अजीब EXC_BAD_ACCESS क्रैश मिला। यह अक्सर होता है, लेकिन मुझे स्टैक ट्रेस से कोई सार्थक जानकारी नहीं मिल सकती है। ओपन-सोर्स लाइब्रेरीज़ (SDWebImage में से एक और SocketRocket में से एक) को छोड़कर, मेरे कोड के अंदर getBytes:length: पर कोई कॉल नहीं है, लेकिन ऐसा लगता है कि वे क्रैश का कारण बन रहे हैं।ट्रैक नहीं कर सकता [NSData getBytes: length:] क्रैश

एकमात्र संकेत यह है कि क्रैश com.apple.CFNetwork.addPersistCacheToStorageDaemon थ्रेड के अंदर होता है, लेकिन मुझे नहीं पता कि इसके बारे में क्या है। क्या कोई मदद कर सकता है?

Crashlytics से स्टैकट्रेस: ​​

Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon 
0 libsystem_platform.dylib  0x3044a208 _platform_memmove$VARIANT$CortexA9 + 160 
1 Foundation      0x22df9167 -[NSData(NSData) getBytes:length:] + 118 
2 Foundation      0x22df9167 -[NSData(NSData) getBytes:length:] + 118 
3 Foundation      0x22e21a1b -[NSData(NSData) replacementObjectForCoder:] + 134 
4 Foundation      0x22dc2aff -[NSXPCEncoder _replaceObject:] + 90 
5 Foundation      0x22e240dd -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 192 
6 Foundation      0x22e212ff -[NSDictionary(NSDictionary) encodeWithCoder:] + 922 
7 Foundation      0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604 
8 Foundation      0x22dc379d encodeInvocationArguments + 460 
9 Foundation      0x22dc3455 -[NSXPCEncoder encodeInvocation:] + 360 
10 Foundation      0x22dc32c9 -[NSXPCEncoder _encodeObject:] + 604 
11 Foundation      0x22dc2335 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 1860 
12 Foundation      0x22dd2823 -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:] + 58 
13 Foundation      0x22dd27db -[_NSXPCDistantObjectWithError forwardInvocation:] + 114 
14 CoreFoundation     0x2217e831 ___forwarding___ + 352 
15 CoreFoundation     0x220afb88 _CF_forwarding_prep_0 + 24 
16 CFNetwork      0x21c52ac9 -[NSURLStorage_CacheClient addCachedResponseWithDictionary:key:] + 120 
17 CFNetwork      0x21c21e29 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1576 
18 libdispatch.dylib    0x302cf423 _dispatch_call_block_and_release + 10 
19 libdispatch.dylib    0x302d95d9 _dispatch_queue_drain$VARIANT$mp + 948 
20 libdispatch.dylib    0x302d90a9 _dispatch_queue_invoke$VARIANT$mp + 84 
21 libdispatch.dylib    0x302db0d3 _dispatch_root_queue_drain + 330 
22 libdispatch.dylib    0x302dc1fb _dispatch_worker_thread3 + 106 
23 libsystem_pthread.dylib  0x3044ce25 _pthread_wqthread + 668 

और एक और एक (कम अक्सर ऐसा होता है):

Thread : Crashed: com.apple.CFNetwork.addPersistCacheToStorageDaemon 
0 libsystem_platform.dylib  0x000000019344d300 _platform_memmove + 176 
1 Foundation      0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172 
2 Foundation      0x0000000182dfce18 -[NSData(NSData) getBytes:length:] + 172 
3 Foundation      0x0000000182e2ae3c -[NSData(NSData) replacementObjectForCoder:] + 160 
4 Foundation      0x0000000182dbd320 -[NSXPCEncoder _replaceObject:] + 120 
5 Foundation      0x0000000182e2dac8 -[NSXPCEncoder _encodeArrayOfObjects:forKey:] + 256 
6 Foundation      0x0000000182e2a544 -[NSDictionary(NSDictionary) encodeWithCoder:] + 1016 
7 Foundation      0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716 
8 Foundation      0x0000000182dbe2e8 encodeInvocationArguments + 508 
9 Foundation      0x0000000182dbdee4 -[NSXPCEncoder encodeInvocation:] + 412 
10 Foundation      0x0000000182dbdd10 -[NSXPCEncoder _encodeObject:] + 716 
11 Foundation      0x0000000182dbcb0c -[NSXPCConnection _sendInvocation:proxyNumber:remoteInterface:withErrorHandler:timeout:userInfo:] + 2196 
12 CoreFoundation     0x0000000181fde230 ___forwarding___ + 440 
13 CoreFoundation     0x0000000181ee2b6c _CF_forwarding_prep_0 + 92 
14 CFNetwork      0x000000018199c908 ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1976 
15 libdispatch.dylib    0x00000001932793ac _dispatch_call_block_and_release + 24 
16 libdispatch.dylib    0x000000019327936c _dispatch_client_callout + 16 
17 libdispatch.dylib    0x00000001932834c0 _dispatch_queue_drain + 1216 
18 libdispatch.dylib    0x000000019327c474 _dispatch_queue_invoke + 132 
19 libdispatch.dylib    0x0000000193285224 _dispatch_root_queue_drain + 664 
20 libdispatch.dylib    0x000000019328675c _dispatch_worker_thread3 + 108 
21 libsystem_pthread.dylib  0x00000001934552e4 _pthread_wqthread + 816 
+0

क्या यह विकास पर्यावरण में होता है? – zaph

+0

@Zaph: नहीं, इसे स्वयं पुन: उत्पन्न नहीं कर सका। केवल उत्पादन में होता है। – Spail

+1

संभवतः 'गेटडाटा' को एक फर्जी बफर पता पारित किया गया था, लेकिन जो जिम्मेदार होता, अनुमान लगाना कठिन होता है। ध्यान दें कि दोनों मामलों में यूआरएल कैश के साथ संचालन शामिल है। –

उत्तर

2

मेरा अनुमान है कि आप है

  • कुछ __unsafe_unretained (उस के लिए unavoidable है सेटर पथ [NSInvocation setArgument:atIndex:])
  • या this एक
  • या की तरह एक मुद्दा (अधिक होने की संभावना) एक performBlockAndWait के दौरान एक deadlock

संबंधित सुझावों में से एक जोड़े (के बाद से मैं ढेर में एक कनेक्शन/टाइमआउट देखा है) :

1) NSManagedObject, NSManagedObjectContext, और NSPersistentStoreCoordinator (addPersistCacheToStorageDaemon पर दुर्घटना को देखते हुए) सुरक्षित थ्रेड नहीं हैं:

012,
  • इस पर विचार करता है, तो आप performBlockAndWait उपयोग कर रहे हैं अपने NSManagedObjectContext (अधिक here और here) या nested MOC को संदेश भेजने के लिए।

    • तो NSURL का उपयोग नहीं:

    2) CFNetwork एक निचले स्तर वर्ग कि NSURLConnection से लपेटा जाता है है? एनएसआरएल सत्र की संपत्ति के लिए addObserver:self forKeyPath (केवीओ) से परहेज करना?

2

मुद्दा सकता है वास्तव में SDWebImage से इस साइट से बोली हो:

http://webcache.googleusercontent.com/search?q=cache:BCShJT0ZrvoJ:quabr.com/15786084/uicollectionview-bad-acces-on-uicollectionviewdata-setlayoutattributesatglo+&cd=7&hl=fr&ct=clnk&gl=jp

अब अगर आप AFNetworking उपयोग कर रहे हैं AFNetworking श्रेणी आप कर सकते हैं का उपयोग कर URL से सीधे छवि स्थापित करने के लिए वैकल्पिक विधि का उपयोग करना चाहते हैं ताकि आप छवि में हस्तक्षेप और आकार बदल सकें। नीचे दिया गया कोड ऐसा करेगा।आप SDWebImage के नवीनतम संस्करण उपयोग कर रहे हैं

https://github.com/rs/SDWebImage/issues?q=is%3Aopen+is%3Aissue+label%3Acrash

चेक, अन्यथा आप बड़े मुद्दों की जाँच करने के लिए हो सकता है:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL]; 
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; 

[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
    // resize image 
    // set image on imageView 
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 
    // handle error 
}]; 

मैं भी संबंधित दुर्घटनाओं के लिए इस पेज की जाँच करेगा।

3

आईओएस 8 की शुरूआत के साथ कुछ अनपेक्षित बग घटना भी हो रही है जो हमें इसे ध्यान में रखना है।

एमआईटी मोबाइल जैसे ऐप्स, मील प्वाइंट भी आपके जैसे मुद्दे से पीड़ित है, हालांकि यह अब तक व्यापक प्रसार नहीं है।

यहां MIT & MilePoint के लिए बग लिंक हैं।

com.apple.CFNetwork.addPersistCacheToStorageDaemon

CFNetwork निचले स्तर सी एपीआई है और यह NSURLConnection की तरह उच्च स्तर वर्ग द्वारा लपेटा जाता है।

तो दुर्घटना एक नेटवर्क आपरेशन

EXC_BAD_ACCESS

इसका मतलब है कि संदेश एक स्मृति पता नहीं है जहां एक वर्ग यह निष्पादित करने के लिए का कोई उदाहरण नहीं है के लिए भेजा गया दौरान होता। इस प्रकार परिणाम "खराब पहुंच"

यह कब होगा?

  1. एक वस्तु
  2. एक वस्तु प्रारंभ नहीं किया गया है पहले से ही जारी किया गया है
  3. कुछ और है कि बहुत से होने की

हम इस समस्या को कैसे हल कर सकते हैं होने की संभावना नहीं है?

  • आप

को सक्षम करने से xcode में NSZombie को सक्षम करने से कीड़े (संख्या 2) के कुछ पकड़ कर सकते हैं NSZombie:

जब यह सुविधा सक्षम है, एक डमी वस्तु (एक ज़ोंबी) प्रत्येक जारी वस्तु के स्थान पर रखा जाता है, इस प्रकार पहले से जारी किए गए ऑब्जेक्ट्स को डीबग करने की इजाजत देता है।सक्षम करने के लिए बहुत आसान:

  1. डबल XCode में "निष्पादन योग्य" में अपने निष्पादन क्लिक
  2. खोलें "तर्क" टैब "चर वातावरण में सेट किया जाना है" में (कि नीचे दी गई सूची है, सावधान रहना आप किस संपादित करें)
  3. क्लिक करें "+" बटन और वेरिएबल का नाम के लिए दर्ज करें "NSZombieEnabled" और मूल्य के लिए "हाँ"

अब बजाय सोच क्या हो रहा है और जो है सटीक वस्तु समस्या पैदा होने वाली , आप देखेंगे कि कौन सी कक्षा परेशानी निर्माता है, ए और आप इसे बहुत तेजी से डीबग करेंगे।

नोट: जब आप ऐप स्टोर में अपना ऐप सबमिट करते हैं तो ज़ोंबी सक्षम न करें। साथ ही, यदि आपको वास्तव में उनकी आवश्यकता नहीं है तो उन्हें अक्षम करने के लिए यह एक अच्छा अभ्यास है।

  • आप तृतीय पक्ष लाइब्रेरी का उपयोग कर रहे हैं, तो कृपया करने के लिए नवीनतम

नोट इसे अद्यतन:

मेरे सुझाव जब तक अपने अपरिहार्य तीसरे पक्ष के ढांचे का उपयोग कभी नहीं रहा है क्योंकि पुस्तकालय ही कीड़े कभी कभी होगा जो डेवलपर नियंत्रण से बाहर है और कभी-कभी लाइब्रेरी को वर्तमान एसडीके में अपडेट किया जाएगा। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं here

आशा है कि इससे

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