39 votos

No válido montón de dirección y de la señal fatal 11

Cada tan a menudo que mi aplicación se bloqueará y mi registro será el siguiente:

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

A veces code=2, pero siempre Fatal signal 11 y invalid heap address.

He tratado de investigar lo que esto significa y cómo solucionarlo. Este hilo ha sido de lo más útil; sin embargo, todavía estoy sin solución.

El error se produce cuando corro un par de AsyncTasks descargar varias imágenes.

Este es mi principal 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);
}

Aunque he tratado de investigar qué pasa con esto, aún me encuentro perdido cuando se trata de la fijación. Si alguien tiene algún conocimiento, me gustaría apreciar viendo. El error no es lanzado cada vez que me execute mi AsyncTasks, pero no puedo encontrar mucho de un patrón para ayudar a aislar por qué está sucediendo esto. Hay un par de hilos sobre LO acerca fatal signal 11, pero no ofrece mucha ayuda en mi caso.

38voto

Ivan Puntos 881

Me encontré en el mismo problema y lo tenía en una re-producable estado. Este es el error que estaba recibiendo:

08-04 17:37:05.491:/libc(4233): @@@ ABORTAR: no VÁLIDO MONTÓN de DIRECCIÓN EN dlfree 08-04 17:37:05.491:/libc(4233): señal Fatal 11 (SIGSEGV) en 0xdeadbaad (código=1)

Lo que se reducía a es una llamada a una función que está compuesto por dos hilos diferentes al mismo tiempo.

Más específicamente, esta función fue BluetoothSocket del método close ().

He comprobado el código fuente de este sitio web , y la llamada no está sincronizada (no sé si esto ha cambiado ya que es a partir de Android 2.1).

En cualquier caso, ¿tal vez tienen un similar escenario en el que una llamada a una función se realiza a partir de múltiples hilos? No se puede decir que para asegurarse de que el código fuente está mostrando.

También he intentado no usar THREAD_POOL_EXECUTOR? De acuerdo con el android dev guía:

Cuando se introdujo por primera vez, AsyncTasks fueron ejecutadas en serie en un único subproceso en segundo plano. Comenzando con DONUT, esto fue cambiado a un conjunto de subprocesos que permiten múltiples tareas para operar en paralelo. Comenzando con nido de abeja, las tareas se ejecutan en un solo hilo para evitar la aplicación común de los errores causados por la ejecución en paralelo.

6voto

PolyMesh Puntos 352

Yo tenía este mismo error de ayer. Siempre pasó, pero no siempre es consistente. Qué lo causó para mí no ha sido hasta ahora mencionados.

Yo pensé que podría tener un problema similar, porque yo también estaba tratando con hilos, sin embargo me quitaron todos mis hilos y el problema se sigue produciendo. Finalmente, después de un montón de instrucciones de impresión de que yo era capaz de seguir la pista a una clase que había utilizado en su día que había un puntero como un miembro privado, pero se me olvidó inicializar el puntero.

Más tarde, cuando la clase se destruye estaba tratando de eliminar el puntero, sin embargo debido a que el puntero no inicializado a NULL, se puede o no puede tener un poco de basura valor, por lo que a veces podría no causar un accidente y otras veces. Esto es probablemente debido a que cuando la basura valor fue de una ubicación de memoria que no me pertenece o cuando lo hace y puedo borrar algo importante, él es la causa del accidente/error.

He aquí una despojado ejemplo del problema que me encontré:

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

Interesante nota, este accidente no se produjo en mi Transformer Prime, pero no en mi Nexus4. Simplemente va a demostrar que la debemos a prueba en varios dispositivos! Hasta el momento el Nexus gana en ayudarme a realizar un seguimiento de errores como parece ser mucho más exigentes.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X