2015-03-09 3 views
7

Ich habe eine seltsame EXC_BAD_ACCESS Absturz in Foundation -[NSData(NSData) getBytes:length:] Methode. Es passiert ziemlich oft, aber ich kann keine bedeutungsvollen Informationen aus der Stapelverfolgung erhalten. Es gibt keine Aufrufe an getBytes:length: in meinem Code, außer für Open-Source-Bibliotheken (eine in SDWebImage und eine in SocketRocket), aber es scheint nicht, dass sie den Absturz verursachen.Kann nicht aufspüren [NSData getBytes: length:] Absturz

Der einzige Hinweis ist, dass der Absturz innerhalb com.apple.CFNetwork.addPersistCacheToStorageDaemon Thread passiert, aber ich habe keine Ahnung, worum es geht. Kann jemand helfen?

Stacktrace von 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 

Und ein anderer (geschieht seltener):

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

Tritt dies in der Entwicklungsumgebung auf? – zaph

+0

@Zaph: Nein, ich konnte es nicht selbst reproduzieren. Passiert nur in der Produktion. – Spail

+1

Vermutlich wurde 'getData' eine falsche Pufferadresse übergeben, aber wer verantwortlich gewesen wäre, ist schwer zu erraten. Beachten Sie, dass beide Fälle Vorgänge mit dem URL-Cache betreffen. –

Antwort

2

Meine Vermutung ist, dass Sie

  • einige __unsafe_unretained haben (dh unavoidable für Setter Path [NSInvocation setArgument:atIndex:])
  • oder ein Problem wie this ein
  • oder (wahrscheinlicher) ein deadlock während eines performBlockAndWait

Ein paar ähnliche Vorschläge (da habe ich eine Verbindung/Timeout in dem Stapel zu sehen) :

1) NSManagedObject, NSManagedObjectContext und NSPersistentStoreCoordinator (der Crash bei addPersistCacheToStorageDaemon angegeben) sind nicht sicher fädeln:

012.
  • betrachten dies, wenn Sie performBlockAndWait verwenden, um Nachrichten zu senden zu Ihrem NSManagedObjectContext (mehr here und here) oder nested MOC.

2) CFNetwork ist eine untergeordnete Klasse, die durch die NSURLConnection gewickelt ist:

  • so verwendet NSURL nicht? Vermeiden addObserver:self forKeyPath (KVO) zu einer Eigenschaft einer NSURL-Sitzung?
2

Das Problem könnte tatsächlich von dieser Seite aus SDWebImage Zitat sein:

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

Nun, wenn Sie AFNetworking verwenden aus der URL direkt auf das Bild, um die AFNetworking Kategorie verwenden, können Sie möchte die alternative Methode verwenden, damit Sie das Bild intervenieren und die Größe ändern können. Der folgende Code wird das tun.

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 
}]; 

Ich würde überprüfen, diese Seite auch für ähnliche Abstürze:

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

Überprüfen Sie, ob Sie die neueste Version von SDWebImage verwenden, sonst könnte man ältere Ausgaben überprüfen müssen.

3

Mit der Einführung von iOS 8 gibt es auch einige unerwartete Bug-Ereignisse, die wir ebenfalls berücksichtigen müssen.

Apps wie MIT Mobile, Mile Point leidet auch unter dem Problem wie Ihres, das ist aber nicht weit verbreitet, ab sofort.

Hier sind die Fehlerlinks für MIT & MilePoint.

com.apple.CFNetwork.addPersistCacheToStorageDaemon

CFNetwork niedriger Ebene C API und es wird durch höhere Ebene Klasse wie NSURLConnection gewickelt.

so tritt der Absturz während eines Netzbetrieb

EXC_BAD_ACCESS

Es bedeutet, dass Nachricht an eine Speicheradresse geschickt wurde, wo es keine Instanz einer Klasse ist es auszuführen. Somit ergibt sich "schlechter Zugriff"

Wann wird es passieren?

  1. Ein Objekt wird
  2. Ein Objekt freigegeben wird bereits
  3. Etwas anderes, das nicht sehr wahrscheinlich ist, passieren

Wie können wir dieses Problem lösen nicht initialisiert?

  • Sie können durch Aktivieren der NSZombie in Xcode

Aktivieren NSZombie einige der Bugs (Nummer 2) fangen:

Wenn diese Funktion aktiviert ist, wird ein Dummy-Objekt (ein Zombie) wird an der Stelle jedes freigegebenen Objekts gehalten, wodurch es ermöglicht wird, Objekte zu debuggen, die bereits freigegeben wurden.Sehr einfach zu aktivieren:

  1. Klicken Sie doppelt auf die ausführbare Datei in den „Executables“ in XCode
  2. Open „Argumente“ Registerkarte In „Variablen in der Umgebung festgelegt werden“ (das ist die Liste unten, seien Sie vorsichtig welches Sie bearbeiten)
  3. klicken Sie auf die Schaltfläche „+“ und für Name der variablen eingeben „NSZombieEnabled“ und Wert „YES“

anstatt nun fragen, was los ist und welche genaue Objekt, das Problem erzeugt , Sie werden genau sehen, welche Klasse der Unruhestifter ist, a Und du wirst es ziemlich schnell debuggen.

Hinweis: Lassen Sie die Zombies nicht aktiviert, wenn Sie Ihre App an den App Store senden. Es ist auch eine gute Übung, sie zu deaktivieren, wenn Sie sie nicht wirklich brauchen.

  • Wenn Sie Bibliotheken von Drittanbietern verwenden, kindly es ein Update auf den neuesten

Hinweis:

Mein Vorschlag ist nie Dritter Rahmen, wenn seine unvermeidbaren verwenden, da die Bibliothek selbst Fehler haben wird manchmal Das ist außerhalb der Kontrolle des Entwicklers und manchmal Bibliothek würde spät zu aktuellen SDK aktualisiert werden. Sie können mehr darüber finden here

Hope hilft

Verwandte Themen