Android NDK debugging in Eclipse - cómo detener los valores de segfaults / SIGILL que solo se producen al introducir código nativo


He configurado la depuración en Eclipse para el código nativo usando el NDK de Android (en Windows XP, con Cygwin) hasta la etapa en la que puedo establecer puntos de interrupción tanto en Java como en código nativo y el depurador los romperá correctamente. Mi problema es que cuando paso a través del código nativo, a menudo obtendré fallas de segmentación/SIGILLs que no ocurren cuando continúo más allá del punto de interrupción.

  • Mi aplicación es depurable como se define en AndroidManifest.xml
  • he alterado el (NDK)/build/core / build-binary.mk para evitar que elimine los símbolos de depuración cuando APP_OPTIM se define como debug, que está en el Application.mk archivo en mi directorio jni
  • He definido LOCAL_CFLAGS := -g -O0 en el Android.mk archivo, y también he probado cada una de estas banderas individualmente

He leído que este problema tiene que ver con el código optimizado generado, pero desactivar la optimización con -O0 no tiene ningún impacto en mi problema. También me he encontrado usando la bandera NDK_BUILD=1 cuando construyendo, pero definiendo debuggable=true en AndroidManifest.xml aparentemente tiene el mismo efecto.

He intentado esto tanto en un emulador (ejecutando 2.3.3) como en un dispositivo (ejecutando 2.2 - que sorprendentemente no tenía los problemas de subproceso que esperaba), con resultados similares (aunque si no recuerdo mal, los fallos ocurrieron en diferentes puntos del código).

¿Alguien tiene alguna idea de posibles correcciones / pasos que podría probar, y / o han sido capaces de paso con éxito a través de código nativo con ¿ningún problema?

Muchas Gracias


Editar:Esto nunca fue realmente resuelto, pero para cualquiera que quiera echar un vistazo a mi guía para la depuración de NDK, puede encontrarla aquí.

Edit 2: Las respuestas que obtuve a esta pregunta llegaron una vez que salieron nuevas versiones del NDK, y esta pregunta ahora puede ser redundante. Mi guía aún puede funcionar, pero no he estado usando el NDK por un tiempo, así que no puedo responder por su corrección continua. He aceptado el respuesta que tengo, ya que los tres dicen básicamente lo mismo, y esa fue la primera que se presentó.

Author: epochengine, 2011-05-05

3 answers

Si funciona para armeabi y no para armeabi-v7a, esto debería ser un problema de compilación. Descomprima el archivo apk en el directorio bin y compruebe que los archivos de la biblioteca en armeabi y armeabi-v7a son los mismos.

 2
Author: user973743,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-14 22:36:37

Una cosa que he notado es que armeabi-v7a no funciona bien para depurar código nativo en ciertos dispositivos. Intenta construir solo para armeabi y mira si eso ayuda.

 0
Author: JonnyBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-12 21:24:09

Compile los archivos fuente de c++ con-march = armv4

En build/core/combo/arm/yourarch.mk ponga-march=armv4 y luego haga mm-B showcommands para comprobar si se utilizó.

Entonces gdbserver puede manejarlo.

 0
Author: Adam Michnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-28 16:04:40