1

Nous avons récemment révisé notre mécanisme de thread en faveur de l'utilisation de dispatch_async dans la plupart des endroits (après avoir beaucoup lu sur NSOperation vs dispatch_async) *. Ensuite, notre code a commencé à s'écraser avec EXC_BAD_ACCESS dans différentes parties du code, toujours sur la partie dispatch_async(queue,...), sans motif clair. Généralement après 20 minutes - 2 heures.EXC_BAD_ACCESS lors de l'utilisation de dispatch_async

Nos dispatch_async blocs ont été utilisés pour informer les auditeurs, se présente comme suit:

NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners 
 
void(^block)(id listener); // Block to execute 
 

 
@synchronized(_listeners) { 
 
    for (id listener in _listeners) { 
 
    dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity 
 
    dispatch_async(queue, ^{ // CRASHING LINE 
 
     block(listener); 
 
    }); 
 
    } 
 
}

y symptômes communs sont:

  • Happens sur iOS10, ne se produit jamais sur iOS8
  • Se produit pendant le débogage mais n'a jamais été signalé production n

(Ceci est une question d'auto-réponse)

* Nous avons aimé la simplicité de dispatch_async, n'a pas besoin des fonctionnalités de blocage/dépendance de NSOperationQueue « s et nous allons passer à C++ bientôt Je voulais donc rester bas niveau.

+0

Pourriez-vous montrer un exemple de ce que vous faites dans votre 'dispatch_async'? – Oskar

+0

@Oskar a ajouté le code –

Répondre

4

Après des jours de débogage, assurant que nos objets de fil ont été fortement retenus, et d'essayer diverses combinaisons faibles forte et le profilage complet à l'aide instruments, nous sommes arrivés à la conclusion que ceci est un bug d'Apple (comme aussi reported here) que n'apparaît que sur les versions iOS récentes (iOS10 pour nous, mais je pense qu'il sera présent à partir de la version quand libBacktraceRecording.dylib a commencé à apparaître).

Les symptômes de:

  • Non reproductible sur iOS8.x
  • se produit uniquement en mode débogage
  • EXC_BAD_ACCESS dans des parties aléatoires du code, sans aucun motif

pourrait indiquer ce.

Espérons que cela est utile pour les autres!

+0

Ceci est très utile pour moi, merci. Sortant mes cheveux en essayant de comprendre ce qui se passe, bon de savoir que ce n'est pas mon code qui est cassé. –