No se puede depurar I / DEBUG (187): señal 11 (SIGSEGV), código 1 (SEGV_MAPERR), error addr 00000004

Estoy trabajando en una aplicación de Android que necesita gran cantidad de asignaciones de memoria (Lote de búferes de imagen). Estoy usando Android NDK para eso. Me encuentro con un extraño accidente. Espero que esto no se repita post (después de pasar por los puestos anteriores)

La aplicación se bloquea con el siguiente error: I / DEBUG (187): señal 11 (SIGSEGV), código 1 (SEGV_MAPERR), error addr 00000004

  1. He encontrado el error de segmentación antes y lo he resuelto.

  2. Estoy bastante seguro de que estoy asignando y desasignación de la memoria correctamente, porque tengo mismo configurado para Windows que confirma que no hay fugas de memoria y no estoy accediendo a ninguna ubicación que no está asignado. (No derefrencing, no hay indicadores malos). No se encontraron corrupciones de memoria durante las pruebas en Windows.

  3. También estoy seguro de que JNI llamadas realizadas para asignaciones y desasignaciones están en el lugar adecuado en el código. La memoria se borra sólo cuando se realiza el uso.

  4. Backtrace muestra diferentes llamadas API cada vez que ocurre el fallo, donde está ocurriendo el error. He tomado registros y ninguno de los punteros son nulos y son como se esperaba.

  5. Este bloqueo se produce muy aleatoriamente . De vez en cuando. A. Cuando estoy dentro de la aplicación por mucho tiempo. B. cuando muchas acciones se realizan dentro de la aplicación. Pero funciona bien la mayor parte del tiempo.

¿Alguien puede sugerir cómo se está dañando la memoria en mi código. Que podria estar causando esto.

Compruebe si hay lugares en los que puede estar accediendo a un campo desde una estructura o desde una matriz. La razón que digo esto es porque la dirección defectuosa es 00000004, que es 4 bytes después de una dirección NULL. Compruebe para cada acceso de campo, especialmente en el código que se realiza muchas veces. Además, compruebe si NULL regresa de malloc / new, es posible que su dispositivo no tenga memoria.

Dado que usted dijo que este problema se produce cuando hay un montón de acciones realizadas o cuando la aplicación se queda en funcionamiento durante mucho tiempo, me gustaría comprobar si hay fugas memmory. Es posible que la aplicación consuma toda la memoria del dispositivo. Si tiene asignadores / desalocadores personalizados, puede utilizar un contador global, para cada asignación que aumente, para cada desasignación, disminuirlo. Si el contador se vuelve demasiado alto, su una fuga memmory.

Una posición aleatoria de la caída a menudo sucede cuando la pila está dañada, por lo que debe buscar cuidadosamente las variables locales. Por ejemplo, sobrescribiendo una matriz de longitud N con M o algo como esto.

fault addr 00000004 => significa que la pila estaba dañada (muy cerca de 0 addr).

Este es un ejemplo de cómo se puede replicar este error de forma accidental dereferencing una cadena como esta:

int a = foo(); LOGE("Foo() is %d", a ? "ok" : "not ok"); 

debe ser "% s" y no "% d"

Espero que ayude a alguien.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.