2012-01-19 11 views
15

Estoy tratando de depurar y pasar por una aplicación de Android que segfaults. Lo intenté ndk-gdb, pero con poca suerte. También me he referido al Android NDK Debugging sin poder depurar mi aplicación.Depuración de aplicaciones nativas Android NDK

cuando intento ndk-gdb --start, y me sale:

$ ndk-gdb --start --verbose 
Android NDK installation path: /opt/android-ndk-r7 
Using default adb command: /opt/android-sdk-linux/platform-tools/adb 
ADB version found: Android Debug Bridge version 1.0.29 
Using final ADB command: '/opt/android-sdk-linux/platform-tools/adb' 
Using auto-detected project path: . 
Found package name: com.example.native_plasma 
ABIs targetted by application: armeabi armeabi-v7a 
Device API Level: 10 
Device CPU ABIs: armeabi-v7a armeabi 
Compatible device ABI: armeabi-v7a 
Found debuggable flag: true 
Found device gdbserver: /data/data/com.example.native_plasma/lib/gdbserver 
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup 
Using toolchain prefix: /opt/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- 
Using app out directory: ./obj/local/armeabi-v7a 
Found data directory: '/data/data/com.example.native_plasma' 
Found first launchable activity: android.app.NativeActivity 
Launching activity: com.example.native_plasma/android.app.NativeActivity 
## COMMAND: /opt/android-sdk-linux/platform-tools/adb shell am start -n com.example.native_plasma/android.app.NativeActivity 
Starting: Intent { cmp=com.example.native_plasma/android.app.NativeActivity } 
## COMMAND: /opt/android-sdk-linux/platform-tools/adb shell sleep 2 
Found running PID: 0 
ERROR: Could not extract PID of application on device/emulator. 
     Weird, this probably means one of these: 

     - The installed package does not match your current manifest. 
     - The application process was terminated. 

     Try using the --verbose option and look at its output for details. 

Esto indica que la aplicación segfaulted más menos, pero no saben cómo establecer un punto de interrupción aquí desde BGF en realidad nunca da un aviso.

También probé este comando:

$ ../../toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-addr2line -f -e libs/armeabi/libnative-plasma.so 
bedb2330 
?? 
??:0 

tengo símbolos de depuración, creo.

  • ndk-build -B V=1 APP_OPTIM=debug
  • Android.mk en jni/ tiene LOCAL_CFLAGS := -g
  • ant debug

También he ndk-build NDK_DEBUG=1 pero todavía consigo donde parece que no tengo los símbolos de depuración.

Aquí hay una imagen del seguimiento de la pila. No hay nada más informativo:

Traceback

+0

no sé si ayudará, pero si usted está buscando algún tipo de documentación (que está fuera de fecha, la mente , ya que habla de NDK r5b), entonces escribí una guía hace unos meses que puedes encontrar [aquí] (http://www.doc.ic.ac.uk/~cb908/AndroidNDK.html).Me temo que no puedo ofrecer más información sobre el problema, excepto para comprobar que el nombre del paquete que se publicó en ese registro es el mismo que en el manifiesto (pero me imagino que sí, ya que encontró el directorio de datos y esas cosas) –

+0

Gracias. Parece que usaste Eclipse. Estoy usando líneas de comando. Espero no tener que usar Eclipse. : \ – Scott

+0

Ah, sí, no pensé en eso. Los principios deben ser los mismos: por lo que sé, Eclipse solo muestra la salida de gdb, y le da a gdb los comandos correctos (por ejemplo, cuando hace clic en el botón de paso), así que no, no es necesario que lo use. Puedes intentar desactivar las optimizaciones en 'LOCAL_CFLAGS' (-O0, creo), pero dudo que haga mucho. ¿Cuán lejos en la aplicación está tu primer punto de quiebre? –

Respuesta

11

Bueno NDK_DEBUG = 1 y la bandera depurable en el conjunto de manifiesto a la verdadera son obligatorios. Cuando construyes la aplicación, en tu proyecto/libs/armeabi, debe haber un archivo gdb.setup. Hay una ruta de búsqueda de símbolos allí, compruebe si es válida. ¿Y probé esto:

ndk-gdb --start --verbose --force 

Y parece que obtiene una excepción de puntero nulo.

+0

después de haber pasado casi la mitad del hermoso día soleado de san francisco, finalmente encontré tu respuesta y listo, mis puntos de interrupción ahora están siendo golpeados con juno después de iniciar gdb según lo prescrito por ti. ¡¡Muchas muchas gracias!! – Viren

7

En las últimas versiones de plug-in que puede hacer clic derecho sobre el paquete y elegir depuración como NDK y Eclipse ->Android aplicación nativa

1

Asegúrese de que se carga la biblioteca nativa, ya sea en una actividad que puede ser lanzado o en tu clase de Aplicación. De lo contrario, no funcionaría y obtendrá el siguiente error No symbol table is loaded. Use the "file" command..

Por ejemplo, en la clase de aplicación:

import android.app.Application; 

public class MyApp extends Application { 

    static { 
     System.loadLibrary("Name"); 
    } 

    public static native int doSomething(); 
} 

Nombre es el nombre de la biblioteca (.so) sin la parte lib.

+0

Muchas gracias, ¡eso fue después de 4h! – marcus

0

resolví poner opción --nowait al comando shell:

ndk-gdb --start --verbose --nowait