43 votes

Adresse de segment non valide et signal fatal 11

Chaque si souvent mon appli crash et mon journal de lecture:

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

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

J'ai essayé la recherche de ce que cela signifie et comment le résoudre. Ce fil a été le plus utile; cependant, je suis toujours sans solution.

L'erreur se produit lorsque j'exécute un couple de AsyncTasks télécharger plusieurs images.

C'est ma principale AsyncTask

public class FetchArtistImages extends AsyncTask<Void, Integer, String[]> implements Constants {

private final WeakReference<Context> contextReference;

public FetchArtistImages(Context context) {
    contextReference = new WeakReference<Context>(context);
}

@Override
protected String[] doInBackground(Void... params) {
    String[] projection = new String[] {
            Audio.Artists._ID, Audio.Artists.ARTIST
    };
    String 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<String> artistIds = new ArrayList<String>();
    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é la recherche de ce qui est avec ce, encore je me trouve perdu quand il s'agit de corriger. Si quelqu'un a une bonne idée, je serais certainement apprécier de la voir. L'erreur n'est pas jeté à chaque fois que j' execute mon AsyncTasks, mais je ne trouve pas beaucoup d'un modèle à l'aide d'isoler pourquoi cela se produit. Il ya un couple de d'autres threads sur DONC environ fatal signal 11, mais ils ne fournissent pas beaucoup d'aide dans mon cas.

44voto

Ivan Points 881

Je viens de tomber sur le même sujet, à une re-producable état. C'est l'erreur que je recevais:

08-04 17:37:05.491: A/libc(4233): @@@ ABANDON: SEGMENT non VALIDE l'ADRESSE DANS dlfree 08-04 17:37:05.491: A/libc(4233): Fatal signal 11 (SIGSEGV) à 0xdeadbaad (code=1)

Ce qu'il résume à ceci est un appel de fonction étant fabriqués à partir de deux différents threads en même temps.

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

J'ai vérifié le code source de ce site web , et l'appel n'est pas synchronisée (je ne sais pas si cela a changé depuis qu'il est à partir d'Android 2.1).

En tout cas, ne vous ont peut-être un scénario similaire où un appel de fonction est fait à partir de plusieurs threads? Ne pouvez pas dire à coup sûr, à partir du code source dont vous faites preuve.

Aussi avez-vous essayé de ne pas utiliser THREAD_POOL_EXECUTOR? Selon l'android dev guide:

Lors de sa première apparition, AsyncTasks ont été exécutés en série sur un seul thread d'arrière-plan. En commençant par DONUT, cela a été changé pour un pool de threads qui permet de réaliser plusieurs tâches en parallèle. Départ avec NID d'abeille, les tâches sont exécutées sur un seul thread pour éviter les erreurs d'application causés par l'exécution en parallèle.

8voto

PolyMesh Points 352

J'ai eu ce même message d'erreur hier. C'était toujours le cas, mais pas toujours. Ce qu'il fait pour moi n'a pas été mentionné.

J'ai pensé que je pourrais avoir un problème similaire, parce que moi aussi j'ai eu affaire avec des threads, cependant j'ai enlevé tous mes threading et le problème était toujours en cours. Enfin, après un tas d'instructions d'impression, j'ai été capable de le suivre jusqu'à une classe que j'avais instanciées qui avait un pointeur comme un membre privé, mais j'ai oublié d'initialiser le pointeur.

Plus tard, lorsque la classe détruite, il était tentant de supprimer le pointeur, cependant, parce que le pointeur n'a pas été initialisé à NULL, il peut ou peut ne pas avoir la valeur d'ordures, alors parfois, il ne serait pas causer un accident et d'autres fois, il le ferait. C'est probablement parce que lorsque la valeur d'ordures est un emplacement mémoire qui ne m'appartient pas, ou quand il le fait et j'ai supprimer quelque chose d'important, il provoque la panne/erreur.

Voici une dépouillé exemple 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;
}

Intéressant de noter, cette panne ne se produit pas sur ma transformer Prime, mais l'a fait sur mon Nexus4. Va juste pour montrer, nous devrions tester sur plusieurs appareils! Jusqu'à présent, le Nexus gagne sur de m'aider à traquer les bugs qu'il semble être beaucoup plus exigeant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X