2012-10-03 15 views
28

में क्रैश होता है मेरे पास सेब स्टोर पर एक ऐप है और आईओएस 6 अपडेट के बाद मुझे MKMapView के भीतर क्रैश रिपोर्ट मिली है। मैं अपने उपकरणों पर दुर्घटना को पुन: उत्पन्न करने का प्रबंधन नहीं कर सकता। यह EAGLContext के साथ एक समस्या की तरह दिखता है। हम अपने ऐप में ओपनजीएल का उपयोग नहीं करते हैं, लेकिन हमारे पास विभिन्न नियंत्रक में MKMapView के एक से अधिक उदाहरण हैं। मुझे यहां एक समान समस्या मिली है iOS 6 app crashes in EAGLContext when displaying maps लेकिन वे OpenGL का उपयोग करते हैं।कभी-कभी आईओएस 6 एमकेमैप व्यू initWithFrame

Exception Type: SIGSEGV 
Exception Codes: SEGV_ACCERR at 0x1 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libGPUSupportMercury.dylib   0x00000e22 gpus_ReturnNotPermittedKillClient + 10 
1 libGPUSupportMercury.dylib   0x3bccc5fb gldCreateContext + 190 
2 GLEngine       0x344c2b15 gliCreateContextWithShared + 676 
3 OpenGLES       0x0000491d -[EAGLContext initWithAPI:properties:] + 1433 
4 OpenGLES       0x000042d7 -[EAGLContext initWithAPI:sharedWithCompute:] + 143 
5 VectorKit       0x00011c81 -[VGLGPU init] + 105 
6 VectorKit       0x000d4659 __24+[VGLGPU sharedInstance]_block_invoke_0 + 49 
7 libdispatch.dylib     0x000014b7 _dispatch_client_callout + 23 
8 libdispatch.dylib     0x000073f7 dispatch_once_f$VARIANT$mp + 43 
9 VectorKit       0x00011c13 +[VGLGPU sharedInstance] + 39 
10 VectorKit       0x00001db1 -[VKMainLoop updateLinkState] + 485 
11 VectorKit       0x00001955 -[VKScreenCanvas _updateDisplayStatus:] + 109 
12 UIKit        0x0001c371 -[UIView initWithFrame:] + 129 
13 VectorKit       0x00010ca5 -[VGLScreenCanvas initWithFrame:context:] + 53 
14 VectorKit       0x00010a7d -[VKScreenCanvas initWithFrame:context:] + 57 
15 VectorKit       0x00010a3f -[VKScreenCanvas initWithFrame:] + 39 
16 VectorKit       0x000106bd -[VKMapCanvas initWithFrame:shouldRasterize:] + 65 
17 VectorKit       0x000104bb -[VKMapView initWithFrame:andGlobe:shouldRasterize:] + 647 
18 MapKit        0x0000dc95 -[MKMapView _commonInitAndEnableLoading:fromIB:] + 725 
19 MapKit        0x0000d811 -[MKMapView initWithFrame:] + 257 
..... 
+0

क्या आप वाकई मेमोरी रिसाव के कारण नहीं हैं?मुझे एक समान समस्या का सामना करना पड़ रहा है लेकिन मैंने पहले से ही कारण की पहचान की है। आईओएस 6 एमकेमैप व्यू पिछले एक की तुलना में 10x अधिक मेमोरी ले रहा है। मेरा ऐप नक्शे पर सामान दिखाने के बारे में है और इसका पदचिह्न 30 एमबी से 280 एमबी तक बढ़ गया है। मैं इसे हल करने की कोशिश कर रहा हूं, लेकिन अभी तक कोई सुराग नहीं है। – Trein

+0

हाय @ ट्रेइन, अपवाद एसआईजीएसईजीवी है, जो मैं समझता हूं कि यह खराब स्मृति पहुंच के कारण होना चाहिए। – Breezeight

उत्तर

25

हमें एक ही समस्या हो रही थी जब उपयोगकर्ता की पृष्ठभूमि हमारे ऐप की तरह ही हम एक विंडो पॉप अप कर रहे हैं जिसमें नक्शा सबव्यू शामिल है। हम पृष्ठभूमि के दौरान ओपनजीएल कॉल का उपयोग कर मानचित्र के कारण दुर्घटना हो रही थी। हम निम्नलिखित की तरह एक जांच में नक्शा subview निर्माण रैप करने के लिए किया था:

UIApplicationState appState = [[UIApplication sharedApplication] applicationState]; 
    if((appState != UIApplicationStateBackground) && (appState != UIApplicationStateInactive)) 
    { 
     // Do map subview initialization... 
    } 
    else 
    { 
     self.attemptedToLoadMap = YES; 
    } 

हम इतना है कि अगर एप्लिकेशन वापस अग्रभूमि करने के लिए आता हम प्रदर्शन के लिए में subview जोड़ सकते हैं bool बंद बचा लिया।

आपको यह भी करना होगा जब भी आप मानचित्र को इस तरह से जोड़ रहे हों जिससे पुन: ड्रा ऑपरेशन (उदा।, एनोटेशन जोड़ना) हो।

+0

हाय @ स्टकज, क्या यह आपके दुर्घटना को ठीक करता है? – Breezeight

+0

अभी भी अनुमोदन की प्रतीक्षा कर रहा है ... – stuckj

+0

ऐप सप्ताहांत में अनुमोदित किया गया था। और, हाँ, ऐसा लगता है कि इसे संबोधित किया गया है। क्रैश रिपोर्टिंग में अब इसकी रिपोर्ट नहीं देख रही है। – stuckj

2

मैं एक ऐसी ही स्टैक ट्रेस का सामना करना पड़ रहा हूँ:

यहाँ पश्व-अनुरेखन है। मैंने देखा कि कंसोल में यह वास्तविक समस्या पर अधिक जानकारी दे रहा है: पृष्ठभूमि में रहते समय आप GPU का उपयोग नहीं कर सकते हैं। आईओएस 5 के साथ नक्शे टाइल आधारित थे इसलिए मुझे लगता है कि जीपीयू का उपयोग नहीं किया गया है, लेकिन आईओएस 6 में नए नक्शे वेक्टर ग्राफिक्स और इस प्रकार जीपीयू का उपयोग करते हैं। नतीजतन, पृष्ठभूमि में होने वाले किसी भी मानचित्र का काम अब नहीं हो सकता है।

+0

हाय @ hunterhacker, मुझे उपयोगकर्ताओं से यह स्टैक ट्रेस मिल रहा है। मैं अपने डिवाइस पर क्रैश को पुन: उत्पन्न करने का प्रबंधन नहीं कर सकता। क्या आप बग को पुन: पेश करने में मेरी मदद कर सकते हैं? – Breezeight

+0

मैं इसे सिम्युलेटर में फिर से नहीं बना सका, शायद सिम्युलेटर मानचित्र पीढ़ी के लिए जीपीयू का उपयोग नहीं करता है। जब भी मैंने किसी नए उपयोगकर्ता स्थान के बारे में कॉलबैक प्राप्त करने में पृष्ठभूमि में चलते समय एक नया नक्शा दृश्य बनाने का प्रयास किया तो ट्रेस विश्वसनीय रूप से हुआ। जवाब देने में देरी के लिए खेद है, मुझे यकीन नहीं है कि मुझे उत्तरों पर टिप्पणियों के बारे में अधिसूचित किया जाना चाहिए, लेकिन मुझे यह नहीं मिला। – hunterhacker

3

http://developer.apple.com/library/ios/#qa/qa1766/_index.html

यह तकनीकी गुणवत्ता आश्वासन पता इस मुद्दे

+2

मैं ओपनजीएल का उपयोग नहीं करता, लेकिन ऐप्पल आईओएस 6 मानचित्रों के लिए करता है। शायद उन्हें इस मामले में अपने तकनीकी प्रश्नोत्तर का पालन करना चाहिए? EEK। –

+0

शब्दों की खराब पसंद। यह थोड़ा सा बताता है कि क्या हो रहा है, लेकिन जिस मामले में एक ऐप्पल प्रदान किया गया ढांचा (मैपकिट) ज़िम्मेदार है, यह इस बात को समझाता नहीं है कि इस मुद्दे को "कैसे संबोधित करें" –

3

हमने अपने ऐप में इस बात का कारण नहीं पाया तो मैं मामले में समाधान यह किसी और में मदद मिलेगी पोस्ट करने के लिए करना चाहता था। हमारा प्राथमिक दृश्य नियंत्रक महत्वपूर्ण स्थान परिवर्तनों पर नज़र रखता है जब यह प्रदर्शित होता है और छिपा हुआ होने पर निगरानी बंद कर देता है। हमारे कुछ उपयोगकर्ताओं ने इस स्क्रीन पर एक असंबंधित दुर्घटना का अनुभव किया, जिसने ऐप निगरानी छोड़ दी। जब कोई ऐप महत्वपूर्ण स्थान परिवर्तन अपडेट के लिए पंजीकृत होता है, तो आईओएस वास्तव में ऐप को पृष्ठभूमि में लॉन्च करेगा यदि वह इसे नए स्थान के बारे में बताने के लिए नहीं चल रहा है। चूंकि हमारा ऐप पहली बार आने पर मानचित्र दिखाता है, इससे दुर्घटना हुई। ऐप्पल समर्थन ने हमारे साथ पुष्टि की है कि आईओएस 8.x चलाने वाले 32 बिट डिवाइस पर एक बग है जो ऐप पृष्ठभूमि में होने पर मैप व्यू (या अन्य ओपनजीएल संदर्भ) अपडेट होने पर क्रैश का कारण बन सकता है।

हमने अपना कोड बदल दिया ताकि यदि एक महत्वपूर्ण स्थान परिवर्तन के कारण ऐप लॉन्च किया गया है तो हम तुरंत निगरानी बंद कर दें और ऐप को क्रैश करने के लिए अपवाद फेंक दें। यह उपयोगकर्ता के लिए पूरी तरह से अदृश्य है इसलिए उन्हें दुर्घटना दिखाई नहीं देती है, और यह होने से और दुर्घटनाओं को रोकता है।

- (void)validateLaunchWithOptions:(NSDictionary *)launchOptions 
{ 
    if (launchOptions[@"UIApplicationLaunchOptionsLocationKey"]) { 
     // the app was launched due to a significant location change, which is not valid and causes crashes 
     // prevent this from happening again by disabling significant location monitoring 
     CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
     [locationManager stopMonitoringSignificantLocationChanges]; 

     // intentionally crashing the app here; it is not in a good state and it needs to be prevented from 
     // getting to any code that would re-enable significant location monitoring 
     @throw [NSException exceptionWithName:@"com.redacted.significantLocationLaunch" 
             reason:@"app may not be launched due to significant location changes" 
            userInfo:@{}]; 
    } 
} 

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

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