La aplicación de Android NDK no puede acceder a ningún punto de interrupción

Estoy usando el tutorial https://www.youtube.com/watch?v=kjsC-lKUgM8 para intentar depurar una aplicación NDK sencilla. He hecho todo lo que está en el video excepto:

  1. Estoy en OS X 10.9.3 en lugar de Windows.
  2. No utilizo android:debuggable=true (porque eclipse lo considera como error) en AndroidManifest.xml en su lugar, he configurado la ruta NDK desde Preferences->Android->NDK y en Project Properties -> C/C++ Build desmarcada Use default build command y establecer allí ndk-build NDK_DEBUG=1 APP_OPTIM=debug .
  3. No utilizo el x86 emulator pero el dispositivo Samsung Duos S con Android 4.0.4

Pero el breakpoiin que se utiliza en el video en no ser golpeado en mi caso. Estoy tratando de depurar un proyecto de prueba simple NDK ya el cuarto día. Han investigado gran cantidad de material:

  1. Libro de cocina del kit de desarrollo nativo de Android
  2. Montón de foros y tutoriales
  3. Videos

Pero no puede golpear un solo punto de interrupción. Por favor ayuda si pudieras hacer esto alguna vez.

One Solution collect form web for “La aplicación de Android NDK no puede acceder a ningún punto de interrupción”

Lo que sigue es un extracto de un tutorial que escribí para nuestro equipo interno de desarrollo de Android. La mayor parte de los cuales se derivó de este blog: http://mhandroid.wordpress.com/

Notas importantes:

  1. Utilizo un entorno Linux (Ubuntu 12.04) para mi trabajo con Android.
  2. He utilizado el ADT Bundle para Linux, Build: v22.2.1-833290 (Eclipse IDE + Extras)
  3. Estos pasos son para la depuración de una actividad Java en un objeto compartido JNI.
  4. He creado proyectos de prueba para este tutorial que no se publicarán aquí, aunque las referencias a esos proyectos están presentes en las instrucciones que siguen. Necesitará un proyecto de aplicación Android ya existente, así como un objeto compartido JNI que esté siendo llamado por su código Java.

Preparación del proyecto

  1. Habilitar depuración.

    Abra AndroidManifest.xml, seleccione la ficha Aplicación y establezca Debuggable = true . Esto hará que la aplicación se pueda depurar incluso cuando se ejecuta en un dispositivo que se ejecuta en modo de usuario.

  2. Construir las fuentes nativas . Desde el Terminal, entre en el directorio del proyecto e ingrese:

     ndk-build -B 

    Debería ver la siguiente salida:

    Gdbserver: [arm-linux-androideabi-4.4.3] libs / armeabi / gdbserver
    Gdbsetup: libs / armeabi / gdb.setup
    Compilar ++ thumb: DebuggingTestJNI <= com_sample_test_DebuggingTestActivity.cpp StaticLibrary: libstdc ++. A
    SharedLibrary: libDebuggingTestJNI.so
    Instalar: libDebuggingTestJNI.so => ​​libs / armeabi / libDebuggingTestJNI.so

  3. Limpie el Proyecto. En la barra de menús de Eclipse, seleccione Proyecto → Limpiar. Es bueno realizar este paso cada vez que cambie / construya sus fuentes nativas. Este paso asegura que Eclipse reconstruirá su .apk.

Configuración de depuración nativa

  1. Cree la configuración de depuración de Java. Necesitamos crear una configuración de depuración para entrar en el código fuente de Java.

    • En la barra de herramientas de Eclipse, verá un error verde. Haga clic en la pequeña flecha junto al error y seleccione "Debug Configurations …".
    • Haga doble clic en "Aplicación de Android" en la estructura de árbol de la izquierda. Esto creará una plantilla para una nueva configuración de depuración de aplicaciones para Android.
    • En el campo "Nombre:", llámelo "DebuggingTest Java Debug" para asegurarse de que sabe que esta configuración se aplica específicamente al proyecto DebuggingTest y se dirige a su origen Java.
    • En "Proyecto:", haga clic en el botón "Examinar …" y seleccione DebuggingTest.
    • Haga clic en "Aplicar" para guardar los cambios.
    • Haga clic en "Cerrar".
    • En la barra de herramientas de Eclipse, haga clic en la pequeña flecha junto al error y seleccione "Organizar Favoritos …".
    • Haga clic en "Agregar …"
    • Seleccione "DebuggingTest Java Debug" y haga clic en "OK".

    Su nueva configuración de depuración ha sido creada y agregada a sus favoritos. Puede acceder a sus favoritos haciendo clic en la pequeña flecha junto al error de la barra de herramientas. DebuggingTest Java Debug debe estar en la parte superior de la lista.

  2. Ejecute ndk-gdb.

    • En la barra de herramientas de Eclipse, haga clic en la pequeña flecha junto al error y seleccione "DebuggingTest Java Debug". Esto desplegará e instalará DebuggingTest.apk en su dispositivo Android conectado e iniciará el depurador.
    • Vaya al directorio de proyecto DebuggingTest en su Terminal y escriba lo siguiente:

      Ndk-gdb

    Si el comando tiene éxito, debe ver lo siguiente:

    GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation, Inc. GDB es un software libre, cubierto por la Licencia Pública General de GNU, y puede cambiarlo y / o distribuir copias de él bajo ciertas condiciones. Escriba "show copying" para ver las condiciones. No hay absolutamente ninguna garantía para GDB. Escriba "show warranty" para más detalles. Este GDB se configuró como "–host = x86_64-linux-gnu -target = arm-elf-linux". (Sin símbolos de depuración encontrados) …

    Si olvidó iniciar la depuración de la aplicación antes de este paso, obtendrá lo siguiente:

    ERROR: No se pudo extraer PID de la aplicación en el dispositivo / emulador. ¿Está seguro de que la aplicación ya está iniciada? Considere el uso de –start o –launch = si no. Si su archivo Android.mk está malformado o contiene bloques $ (info), obtendrá lo siguiente: cp: target ./obj/local/armeabi/gdb.setup' is not a directory /home/Dev/NDK/ndk-gdb: 639: cannot create start DebuggingTest/jni/Android.mk end DebuggingTest/jni/Android.mk ./obj/local/armeabi/gdb.setup: Directory nonexistent /home/Dev/NDK/ndk-gdb: 640: cannot create start DebuggingTest/jni/Android.mk end DebuggingTest/jni/Android.mk ./obj/local/armeabi/gdb.setup: Directory nonexistent start: invalid option: -x Try iniciar –help 'para obtener más información.

    Si ndk-gdb ya se está ejecutando, obtendrá lo siguiente:

    ERROR: Otra sesión de depuración en ejecución, Use –force para matarla.

    Resuelva sus ERROR antes de continuar. Ndk-gdb DEBE ejecutarse correctamente.

    Ejecutar ndk-gdb no sólo nos asegura que estamos haciendo todo bien hasta ahora, sino que también crea archivos app_process , gdb.setup y libc.so en el subdirectorio obj / local / armeabi / de nuestro proyecto. Esos archivos serán necesarios en pasos posteriores.

  3. Detener la depuración.

    • En su Terminal, escriba CTRL + Z para detener ndk-gdb.
    • En Eclipse, seleccione Ejecutar -> Terminar.
  4. Cree la configuración de depuración de C / C ++. Necesitamos crear una configuración de depuración para entrar en el código fuente de C / C ++.

    • En Eclipse , haga clic en la pequeña flecha junto al error y seleccione "Debug Configurations …".
    • Haga doble clic en "C / C ++ Application" en la estructura de árbol de la izquierda. Esto creará una plantilla para una nueva configuración de depuración de aplicaciones de C / C ++.
    • En el campo "Nombre:", el nombre "DebuggingTest C y depuración CPP" para asegurarse de que sabe que esta configuración se aplica específicamente al proyecto DebuggingTest y orienta su origen C / C ++.
    • En la pestaña "Principal":
      • Haga clic en "Examinar …" en el campo "Aplicación C / C ++:". Navegue hasta "/ home / Test / testing / DebuggingTest / obj / local / armeabi / app_process" y haga clic en "Aceptar".
      • Haga clic en "Examinar …" en el campo "Proyecto:".
      • Seleccione "DebuggingTest" y haga clic en "Aceptar".
      • Marque la casilla "Desactivar construcción automática".
      • En la parte inferior del formulario, verá "Uso de GDB (DSF) … – Seleccione otro …". Pulse el botón "Seleccionar otro …".
      • En el menú desplegable, marque la casilla "Usar ajustes específicos de la configuración".
      • Seleccione "Standard Create Process Launcher" en la lista y presione "OK".
    • En la pestaña "Depurador":
      • Haga clic en el cuadro combinado en el campo "Depurador:" y seleccione "gdbserver".
      • Desactive la casilla "Detener al iniciar en:".
    • En la subpestaña "Principal":
      • Haga clic en "Examinar …" en el campo "GDB depurador:".
      • Vaya a "/home/Dev/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb" y haga clic en "Aceptar". Este depurador se distribuye con el Android NDK .
      • En el campo "Archivo de comandos de GDB:", escriba "/home/Test/testing/DebuggingTest/obj/local/armeabi/gdb2.setup". El archivo gdb2.setup todavía no existe, pero lo crearemos en breve.
      • Active la casilla "Utilizar ruta de acceso de archivo completa para establecer puntos de interrupción".
    • En la subpestaña "Conexión":
      • Establezca "Tipo:" en TCP
      • Establezca "Número de puerto:" en 5039
      • Haga clic en "Aplicar" para guardar los cambios.
    • Haga clic en "Cerrar"
    • En la barra de herramientas de Eclipse, haga clic en la pequeña flecha junto al error y seleccione "Organizar Favoritos …".
    • Haga clic en "Agregar …"
    • Seleccione "DebuggingTest C y CPP Debug" y haga clic en "Aceptar".

    Su nueva configuración de depuración ha sido creada y agregada a sus favoritos. Puede acceder a sus favoritos haciendo clic en la pequeña flecha junto al error de la barra de herramientas. DebuggingTest C y depuración CPP debe estar en la parte superior de la lista.

  5. Crear gdb2.setup. Eclipse no le gusta la línea "target remote: 5039" en el archivo de configuración de gdb porque quiere introducir este comando internamente (por eso configuró el puerto 5039 en el paso anterior). Debido a que el archivo gdb.setup es recreado por los scripts NDK, debe copiarlo en gdb2.setup y apuntar Eclipse al archivo gdb2.setup (lo que hicimos en el paso anterior).

    • En el Explorador de archivos, vaya a "/ home / Test / testing / DebuggingTest / obj / local / armeabi /".
    • Copie el archivo "gdb.setup" y luego péguelo en la misma carpeta. El resultado debe ser un archivo denominado "gdb (copy) .setup".
    • Cambie el nombre "gdb (copy) .setup" a "gdb2.setup".
    • Abra gdb2.setup haciendo doble clic en el archivo.
    • Reemplazar "set solib-search-path ./obj/local/armeabi" por "set solib-search-path / home / Test / testing / DebuggingTest / obj / local / armeabi".
    • Reemplace "file ./obj/local/armeabi/app_process" por "file / home / Test / testing / DebuggingTest / obj / local / armeabi / app_process".
    • Quite la línea que dice "remote remote: 5039".
    • Guarde y cierre el archivo.
  6. Cree ndk-gdb-eclipse. Un último elemento de limpieza de Eclipse. Eclipse ejecutará el binario gdb, por lo que tenemos que eliminar la ejecución de gdb de ndk-gdb. Guardaremos el contenido original haciendo otro Copiar-Pegar-Renombrar.

    • En el Explorador de archivos, vaya a "/ home / Dev / NDK".
    • Copie el archivo "ndk-gdb" y luego péguelo en la misma carpeta. El resultado debe ser un archivo denominado "ndk-gdb (copy)".
    • Cambie el nombre "ndk-gdb (copy)" a "ndk-gdb-eclipse".
    • Abra ndk-gdb-eclipse haciendo un clic derecho -> Abrir con otra aplicación …
    • Seleccione Editor de texto de la lista de aplicaciones
    • En el archivo, busque la línea que lee "$ GDBCLIENT -x native_path $GDBSETUP " (probablemente en la parte inferior) y native_path $GDBSETUP haciendo un prefijo con un carácter "#".
    • Guarde y cierre el archivo.

    Al depurar fuentes nativas dentro del IDE de Eclipse , utilizaremos ndk-gdb-eclipse en lugar de ndk-gdb .

Depuración / entrada en el código

  1. Paso en el código de Java!

    • Coloque un punto de interrupción en el archivo DebuggingTestActivity.java en la línea 20 (System.out.println ("hola mundo!")).
    • Inserte un punto de interrupción en su actividad principal ANTES de realizar cualquier llamada al código nativo. OnCreate () es generalmente el mejor lugar para esto.
    • Inicie la aplicación DebuggingTest en modo de depuración haciendo clic en la pequeña flecha junto al error y seleccionando "DebuggingTest Java Debug".
    • Aparecerá una ventana emergente en la pantalla con la etiqueta "Confirmar cambio de perspectiva". Pulse "Sí" si desea que cambie a su perspectiva de depuración. Yo recomendaría hacerlo.
    • En este punto, usted debe haber golpeado el punto de interrupción que estableció.

    Advertencia: El punto de interrupción que acabamos de golpear se encuentra dentro de la función onCreate. Esta función se llamará DESPUÉS de que se hayan realizado todas las llamadas estáticas de loadLibrary. Observe que fuera de la función onCreate hay un System.loadLibrary ("DebuggingTestJNI") dentro de un bloque estático. Esta llamada loadLibrary se ejecutará antes de entrar en nuestra función onCreate, asegurando que nuestros símbolos nativos se carguen en el momento en que alcanzamos nuestro punto de interrupción inicial. ¡Es imperativo que nos detengan en un punto de interrupción antes de proceder!

  2. Paso en el C / C + + código!

    • En su Terminal, vaya al directorio DebuggingTest y escriba el siguiente comando:

    Ndk-gdb-eclipse <- Recuerde que hemos creado este archivo de nuevo en el paso 6

  3. Si tiene éxito, el comando debe completarse sin ninguna respuesta.
  4. Vuelva a Eclipse y ejecute su depurador C / C ++ haciendo clic en la pequeña flecha junto al error y seleccionando "DebuggingTest C y depuración CPP"
  5. Nota: Cuando hago esto, veo docenas de errores en mi consola Eclipse, pero las cosas parecen estar funcionando …
  6. Cambie de nuevo a su perspectiva de Java.
  7. Haga clic en las flechas dobles en la parte superior derecha de la derecha de la ventana de Eclipse y seleccione Java.
  8. Abra DebuggingTest / jni / com_sample_test_DebuggingTestActivity.cpp
  9. Establezca un punto de interrupción en la primera función JNI que será llamada por su actividad principal.
  10. Haga clic en Ejecutar -> Reanudar (F8)
  11. Obtendrá el mensaje de Perspective Switch de nuevo, así que no dude en volver a la perspectiva de depuración.

¡Deberías haber alcanzado el punto de interrupción que acabamos de establecer en el código nativo!

¡¡¡Felicitaciones!!!

En este punto usted debe ser capaz de tomar lo que ha aprendido y adaptarlo a los proyectos existentes que pueda tener.

  • Android: JNI ERROR (error de aplicación): desbordamiento de tabla de referencia local (máx = 512)
  • Embalaje RAW AAC en el contenedor m4a?
  • Archivo de Android.mk - incluye todos los archivos de origen en diferentes carpetas y subcarpetas
  • Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C
  • Cómo utilizar la API de malla experimental con Project Tango
  • ¿Cómo acceder a recursos (como sonido, imágenes, etc) directamente desde código nativo usando Android-NDK?
  • Mantener los métodos Java llamados desde Android JNI
  • ¿Cómo puedo crear una aplicación NDK con Android Studio 2.1 y com.android.tools.build:gradle:2.1.0?
  • Android ndk jni Ninguna implementación encontrada error
  • Configuración de C ++ 11 (std :: thread) para NDK con ADT / Eclipse
  • ¿Qué dispositivos Android admiten jni?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.