implement - hilos asynctask android
Dirección de pila no válida y señal fatal 11 (2)
Me encontré con el mismo problema y lo tuve en un estado reproducible. Este es el error que estaba recibiendo:
08-04 17: 37: 05.491: A / libc (4233): @@@ ABORTANDO: DIRECCION DE HEAP INVALIDA EN dlfree 08-04 17: 37: 05.491: A / libc (4233): Señal fatal 11 (SIGSEGV) en 0xdeadbaad (código = 1)
Lo que se redujo a es una llamada a la función que se realiza desde dos hilos diferentes al mismo tiempo.
Más específicamente, esta función era el método close () de BluetoothSocket.
Verifiqué el código fuente en este sitio web , y la llamada no está sincronizada (no estoy seguro si esto cambió ya que es de Android 2.1).
En cualquier caso, ¿es posible que tenga un escenario similar en el que se realice una llamada de función desde varios subprocesos? No puedo decir con seguridad del código fuente que está mostrando.
¿También has intentado no usar THREAD_POOL_EXECUTOR? Según la guía de desarrollo de Android :
Cuando se introdujo por primera vez, las AsyncTasks se ejecutaron en serie en un solo hilo de fondo. Comenzando con DONUT, esto se cambió a un grupo de subprocesos permitiendo que múltiples tareas funcionen en paralelo. A partir de HONEYCOMB, las tareas se ejecutan en un solo hilo para evitar errores comunes de aplicación causados por la ejecución en paralelo.
De vez en cuando mi aplicación se bloquea y mi registro lee:
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
A veces, el code=2
, pero siempre la Fatal signal 11
y la invalid heap address
.
He intentado investigar qué significa esto y cómo solucionarlo. Este hilo ha sido el más útil ; Sin embargo, todavía estoy sin una solución.
El error se produce cuando ejecuto un par de AsyncTasks
para 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);
}
A pesar de que he tratado de investigar qué pasa con esto, todavía me encuentro perdido cuando se trata de arreglarlo. Si alguien tiene alguna idea, definitivamente apreciaría verla. El error no se produce cada vez que execute
mis AsyncTasks
, pero no puedo encontrar un patrón que ayude a aislar por qué ocurre esto. Hay un par de otros hilos en SO sobre la fatal signal 11
, pero no proporcionan mucha ayuda en mi caso.
Tuve este mismo error ayer. Siempre sucedió pero no siempre de manera consistente. Lo que me lo causó hasta ahora no se ha mencionado.
Pensé que podría tener un problema similar porque yo también estaba tratando con hilos, sin embargo, eliminé todos los hilos y el problema seguía ocurriendo. Finalmente, después de un montón de declaraciones impresas, pude rastrearlas hasta una clase que había instanciado y que tenía un puntero como miembro privado, pero olvidé inicializar el puntero.
Más tarde, cuando esa clase se destruyó, estaba intentando eliminar el puntero, sin embargo, como el puntero no se inicializó a NULL, puede tener o no algún valor de basura, por lo que a veces no causaría un bloqueo y otras veces lo haría. Probablemente se deba a que cuando el valor de la basura era una ubicación de memoria que no me pertenece o cuando lo hace y borro algo importante, se produce el bloqueo / error.
Aquí hay un ejemplo simplificado del problema que 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;
}
Es interesante notar que este bloqueo no ocurrió en mi Transformer Prime, pero sí en mi Nexus4. ¡Solo queda para demostrar que deberíamos probar en múltiples dispositivos! Hasta ahora, el Nexus gana ayudándome a localizar errores, ya que parece ser mucho más delicado.