2012-10-03 11 views
28

Ich habe eine App im Apple Store und nach dem iOS6 Update habe ich Hunderte von Absturzbericht innerhalb MKMapView. Ich kann den Absturz auf meinen Geräten nicht reproduzieren. Es sieht aus wie ein Problem mit EAGLContext. Wir verwenden OpenGL nicht in unserer App, aber wir haben mehr als eine Instanz von MKMapView in verschiedenen Controller. Ich habe ein ähnliches Problem hier iOS 6 app crashes in EAGLContext when displaying maps gefunden, aber sie verwenden OpenGL.Gelegentlich stürzt iOS 6 MKMapView in initWithFrame

Hier ist die Backtrace:

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

Sind Sie sicher, dass es nicht wegen Speicherverlust ist?Ich habe ein ähnliches Problem, aber ich habe die Ursache bereits identifiziert. Das iOS 6 MKMapView benötigt 10x mehr Speicher als das vorherige. In meiner App geht es darum, die Inhalte auf Karten anzuzeigen. Der Footprint wurde von 30 MB auf 280 MB erhöht. Ich versuche es zu lösen, aber noch keine Ahnung. – Trein

+0

Hi @trein, die Ausnahme ist SIGSEGV, von dem was ich verstehe, sollte dies durch einen schlechten Speicherzugriff verursacht werden. – Breezeight

Antwort

25

Wir hatten ein ähnliches Problem, wenn Benutzer Hintergrund unsere App nur so, wie wir ein Fenster mit einer Karte Unteransicht auftauchen. Der Absturz schien aufgrund der Karte zu geschehen, die einen OpenGL-Aufruf benutzte, während wir im Hintergrund waren. Wir hatten die Karte subview Schöpfung in einer Kontrolle wie folgt zu wickeln:

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

wir die Bool gerettet aus, so dass, wenn die App in den Vordergrund kommt zurück wir die Subview in für die Anzeige hinzufügen können.

Sie müssen dies immer dann tun, wenn Sie die Karte so manipulieren, dass eine erneute Zeichenoperation ausgelöst wird (z. B. Hinzufügen einer Anmerkung).

+0

Hi @stuckj, repariert es deinen Absturz? – Breezeight

+0

Noch auf Genehmigung warten ... – stuckj

+0

App wurde über das Wochenende genehmigt. Und, ja, es scheint es angesprochen zu haben. Keine Berichte mehr in Absturzberichten. – stuckj

2

Ich bin ein ähnliches Stack-Trace zeigt. Ich habe bemerkt, dass es in der Konsole mehr Details zum eigentlichen Problem gibt: Sie können die GPU nicht im Hintergrund verwenden. Die Karten mit iOS 5 basierten auf Kacheln, daher nehme ich an, dass die GPU nicht verwendet wurde, aber die neuen Karten in iOS 6 verwenden Vektorgrafiken und somit die GPU. Als Folge kann keine Kartenarbeit, die früher im Hintergrund war, mehr sein.

+0

Hallo @hunterhacker, ich bekomme diese Stack-Trace von Benutzern. Ich kann den Absturz auf meinem eigenen Gerät nicht reproduzieren. Könnten Sie mir helfen, den Fehler zu reproduzieren? – Breezeight

+0

Ich konnte es nicht im Simulator neu erstellen, wahrscheinlich weil der Simulator die GPU nicht zur Kartengenerierung verwendet. Die Verfolgung passierte zuverlässig, wenn ich versuchte, eine neue Kartenansicht zu erstellen, während ich im Hintergrund lief und einen Rückruf über einen neuen Benutzerstandort erhielt. Sorry für die Verzögerung bei der Antwort, nicht sicher, wie ich von Kommentaren auf Antworten benachrichtigt werden soll, aber ich habe es nicht verstanden. – hunterhacker

3

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

Die Adresse Technische QA dieses Problem

+2

Ich benutze nicht OpenGL, aber Apple tut für iOS 6 Karten. Vielleicht sollten sie in diesem Fall ihren eigenen technischen Fragen und Antworten folgen? Eek. –

+0

Schlechte Wortwahl. Es erklärt leicht, was passiert, aber in dem Fall, in dem ein von Apple zur Verfügung gestelltes Framework (MapKit) verantwortlich ist, erklärt es nicht, wie man das Problem "anspricht" –

3

Wir haben die Ursache hierfür in unserer App gefunden, so wollte ich die Lösung für den Fall schreiben es sonst jemand helfen würde. Unser primärer View-Controller überwacht signifikante Standortänderungen, wenn er angezeigt wird, und stoppt die Überwachung, wenn er verborgen ist. Bei einigen unserer Nutzer kam es auf diesem Bildschirm zu einem Absturz, bei dem die App nicht überwacht wurde. Wenn sich eine App für wichtige Standortänderungsupdates registriert hat, startet iOS die App tatsächlich in den Hintergrund, wenn sie nicht ausgeführt wird, um sie über den neuen Standort zu informieren. Da unsere App beim Start eine Karte anzeigt, führte dies zu einem Absturz. Der Apple-Support hat uns bestätigt, dass auf 32-Bit-Geräten mit iOS 8.x ein Fehler vorliegt, der einen Absturz verursachen kann, wenn ein MapView (oder ein anderer OpenGL-Kontext) aktualisiert wird, während sich die App im Hintergrund befindet.

Wir haben unseren Code so geändert, dass wir die Überwachung sofort stoppen und eine Ausnahme auslösen, um die App zum Absturz zu bringen, wenn die App aufgrund einer signifikanten Standortänderung gestartet wird. Dies ist für den Benutzer völlig unsichtbar, so dass sie den Absturz nicht bemerken und weitere Abstürze verhindert werden.

- (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:@{}]; 
    } 
} 

Wir sahen Tausende dieser Absturz waren aber nicht in der Lage es auf unserer Testgeräte zu kopieren, bis wir die Ursache herausgefunden. Wenn Sie es duplizieren möchten (und auch das Update bestätigen), @ lösen Sie sofort eine Ausnahme aus, nachdem Ihre App mit der Überwachung wichtiger Standortänderungen begonnen hat. Nachdem die App abgestürzt ist, fahren Sie los. Sobald dein Handy die Mobilfunkmasten wechselt, wird iOS die App im Hintergrund starten und du wirst den Absturz bekommen. Wir konnten eines unserer Mobiltelefone in die Hände bekommen und die Unfallprotokolle einsehen. Alle Unfälle passierten während ihrer Fahrt zur und von der Arbeit.

Verwandte Themen