2017-08-25 1 views
-1

J'ai un problème de mémoire. Je reçois un message d'erreur "Thread 1: EXC_BAD_ACCESS (code = 1, adresse = ...) L'erreur est insaisissable, et apparemment dépendante du timing. Sur mon iPad mini, il fait en moyenne environ 3 minutes entre les plantages, sur mon iPhone SE, il dure en moyenne 10 minutes, et sur le simulateur il a fonctionné pendant 20 heures sans se bloquer. Je n'ai pas réussi à utiliser le détecteur Zombie. (Voir ci-dessous pour mes expériences avec elle.) Donc j'essaie d'aller sur mon code avec un peigne à dents fines pour voir ce qui pourrait causer le crash. Quels sont les problèmes susceptibles de provoquer une erreur d'allocation?Causes possibles d'une erreur de mémoire

Mon application est multithread. Il prend le son du microphone, le traite et met continuellement à jour l'affichage avec les résultats traités. Il est écrit dans Swift 3, donc je ne fais pas de mallocs ou de libres explicites.

Je cherche des endroits dans le code qui pourraient causer une erreur. Les deux choses que je regarde le plus sont des références faibles et des pointeurs dangereux. Y a-t-il d'autres erreurs de programmation courantes qui pourraient me faire trébucher? Le détecteur de zombies est inutile Le guide de l'utilisateur d'Apple Instruments indique: «Pour les applications iOS, utilisez le modèle Zombies avec le simulateur iOS, plutôt qu'un périphérique physique.» J'ai ignoré l'avertissement et l'ai essayé avec mon iPad mini, et je ne peux pas le faire tomber en panne.Tout tourne à environ 1/10 de la vitesse, et quand je fais une pause l'enregistrement, ma machine OSX devient lente, affichant le curseur "Attendre" tournant pendant des minutes à la fois. L'allocation de mémoire totale monte et descend, mais reste dans les limites, donc il n'y a pas de fuite de mémoire majeure.J'ai également exécuté l'instrument Zombies sur le simulateur.Il est également lent, et il ne plantage toujours pas.)

+0

Êtes-vous capable d'attraper le crash dans le débogueur? Y a-t-il une pile? Avez-vous des blocs qui capturent 'self' comme 'non-propriétaire'? –

+0

Oui, il apparaît dans le débogueur. Voici le code qu'il affiche sur 'let loByte = octets [pos]' 'let hiByte = octets [pos + 1] // casse ici' Les valeurs réelles varient, mais cette dernière position était 630. Il n'y a rien d'inhabituel dans le débogueur à propos des octets ou des 630ème et 631ème éléments d'octets. –

Répondre

0

Le problème dans ce cas s'avère être la sécurité des threads. Si je définis une variable UInt8 sur un thread et le lire sur un autre thread, cela peut entraîner une erreur de mémoire. Les setters et les getters ne sont pas thread safe.

(J'ai programmé des ordinateurs pendant la plus grande partie de ma vie professionnelle, principalement en C, C++ et Java.Je suis familier avec les problèmes de multi-threading dans ces langages. Cela ne m'avait pas semblé jusqu'à présent que paramétrer et obtenir des variables numériques n'était pas une opération atomique - qu'un accès inopportun pouvait causer le crash d'un programme Je vais devoir repenser radicalement mon approche de la concurrence avec Swift.