Adresse de tas invalide et signal fatal 11

De temps en temps mon application va planter et mon journal va lire:

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 

Parfois, code=2 , mais toujours le Fatal signal 11 et l’ invalid heap address .

J’ai essayé de chercher ce que cela signifie et comment le réparer. Ce fil a été le plus utile ; Cependant, je suis toujours sans solution.

L’erreur se produit lorsque je lance deux AsyncTasks pour télécharger plusieurs images.

Ceci est mon principal AsyncTask

 public class FetchArtistImages extends AsyncTask implements Constants { private final WeakReference contextReference; public FetchArtistImages(Context context) { contextReference = new WeakReference(context); } @Override protected Ssortingng[] doInBackground(Void... params) { Ssortingng[] projection = new Ssortingng[] { Audio.Artists._ID, Audio.Artists.ARTIST }; Ssortingng sortOrder = Audio.Artists.DEFAULT_SORT_ORDER; Uri uri = Audio.Artists.EXTERNAL_CONTENT_URI; Cursor c = contextReference.get().getContentResolver() .query(uri, projection, null, null, sortOrder); ArrayList artistIds = new ArrayList(); if (c != null) { int count = c.getCount(); if (count > 0) { final int ARTIST_IDX = c.getColumnIndex(Audio.Artists.ARTIST); for (int i = 0; i < count; i++) { c.moveToPosition(i); artistIds.add(c.getString(ARTIST_IDX)); } } c.close(); c = null; } return artistIds.toArray(new String[artistIds.size()]); } @Override protected void onPostExecute(String[] result) { for (int i = 0; i < result.length; i++) { new LastfmGetArtistImages(contextReference.get()).executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, result[i]); } super.onPostExecute(result); } 

Même si j’ai essayé de chercher ce qui se passe, je me trouve toujours perdu quand il s’agit de le réparer. Si quelqu’un a des idées, j’apprécierais certainement de le voir. L’erreur n’est pas AsyncTasks chaque fois que AsyncTasks mes AsyncTasks , mais je ne trouve pas beaucoup de modèle pour vous aider à déterminer pourquoi cela se produit. Il y a quelques autres discussions sur SO concernant le fatal signal 11 , mais elles ne fournissent pas beaucoup d’aide dans mon cas.

Je suis tombé sur le même problème et je l’avais dans un état reproductible. C’est l’erreur que j’ai eue:

08-04 17: 37: 05.491: A / libc (4233): @@@ ABORTING: ADRESSE HEAP INVALIDE IN dlfree 08-04 17: 37: 05.491: A / libc (4233): Signal fatal 11 (SIGSEGV) à 0xdeadbaad (code = 1)

Cela se résume à un appel de fonction provenant de deux threads différents en même temps.

Plus précisément, cette fonction était la méthode close () de BluetoothSocket.

J’ai vérifié le code source sur ce site Web , et l’appel n’est pas synchronisé (je ne suis pas sûr que cela ait changé depuis Android 2.1).

Dans tous les cas, avez-vous un scénario similaire dans lequel un appel de fonction est composé de plusieurs threads? Je ne peux pas dire avec certitude du code source que vous montrez.

Avez-vous également essayé de ne pas utiliser THREAD_POOL_EXECUTOR? Selon le guide de développement Android :

Lors de la première introduction, AsyncTasks ont été exécutés en série sur un seul thread d’arrière-plan. À partir de DONUT, cela a été changé en un pool de threads permettant à plusieurs tâches de fonctionner en parallèle. À partir de HONEYCOMB, les tâches sont exécutées sur un seul thread pour éviter les erreurs d’application courantes provoquées par une exécution en parallèle.

J’ai eu la même erreur hier. Cela s’est toujours produit mais pas toujours de manière cohérente. Ce qui l’a causé pour moi n’a pas encore été mentionné.

Je pensais que je pourrais avoir un problème similaire parce que moi aussi, je traitais des threads, mais j’ai supprimé tous mes threads et le problème se produisait toujours. Finalement, après un certain nombre d’impressions, j’ai pu retrouver une classe que j’avais instanciée et qui avait un pointeur en tant que membre privé, mais j’ai oublié d’initialiser le pointeur.

Plus tard, lorsque cette classe a été détruite, elle tentait de supprimer le pointeur, mais comme le pointeur n’était pas initialisé à NULL, il pouvait ou non avoir une valeur de mémoire, ce qui occasionnait parfois un blocage et d’autres fois. C’est probablement parce que lorsque la valeur de mémoire était un emplacement de mémoire qui ne m’appartient pas ou quand il le fait et que je supprime quelque chose d’important, cela provoque le plantage / l’erreur.

Voici un exemple simplifié du problème que j’ai rencontré:

 class BadFoo { public: BadFoo() {} // BAD! We didn't initialize the pointer ~BadFoo() { if (myPtr) { delete myPtr; } } // OTHER MEMBER FUNCTIONS HERE private: int* myPtr; } class GoodFoo { public: GoodFoo() : myPtr(NULL) {} // GOOD! Can't be garbage value now ~GoodFoo() { if (myPtr) { delete myPtr; } } // OTHER MEMBER FUNCTIONS HERE private: int* myPtr; } 

Il est intéressant de noter que cet incident ne s’est pas produit sur mon Transformer Prime, mais sur mon Nexus4. Va juste pour montrer que nous devrions tester sur plusieurs appareils! Jusqu’à présent, le Nexus a réussi à m’aider à déceler les bogues, car il semble beaucoup plus difficile.