2010-01-13 14 views
8

Estoy intentando depurar una biblioteca compartida nativa que mi aplicación usa a través de JNI. Puedo adjuntar a una aplicación en ejecución muy bien con "gdbserver --attach pid", pero realmente tengo que iniciar mi aplicación cuando ejecuto el comando gdbserver.¿Cómo se puede depurar una aplicación en Android con GDBSERVER?

Hay un millón de visitas al blog sobre este tema, pero ninguna de ellas parece ser clara en cuanto a cómo inicia su aplicación. Todos dicen simplemente escribir "gdbserver 10.0.2.2:1234 ./MyProgram" pero qué es exactamente "MyProgram". Es ese MyProgram.apk? ¿Es MyProgram.so? ¿Se crea algún otro archivo cuando la aplicación está instalada? Si es así, ¿cuál es su camino?

Respuesta

4

Si bien es posible desarrollar aplicaciones autónomas que se pueden iniciar directamente desde el shell como otros describen, parece que su código se ejecuta dentro del marco de aplicación de Android. Por lo tanto, no tiene un ejecutable y en su lugar tiene una APK que contiene sus archivos de clase Dalvik junto con otros recursos, incluido su objeto compartido nativo.

Inicio de una aplicación en un APK implica varios pasos

  1. El proceso system_server recibe una intención de solicitar su aplicación.
  2. Se le dice al proceso zygote que desvíe un nuevo proceso y ejecute un método de su clase.
  3. Su aplicación se ejecuta en el nuevo proceso.

Aunque no se puede poner en marcha un APK directamente por el paso de una ejecutable para gdbserver, su bastante fácil de desencadenar un lanzamiento desde el shell con el comando am.

$ adb -d shell 
# am 
usage: am [subcommand] [options] 

    start an Activity: am start [-D] <INTENT> 
     -D: enable debugging 

    send a broadcast Intent: am broadcast <INTENT> 

    start an Instrumentation: am instrument [flags] <COMPONENT> 
     -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT) 
     -e <NAME> <VALUE>: set argument <NAME> to <VALUE> 
     -p <FILE>: write profiling data to <FILE> 
     -w: wait for instrumentation to finish before returning 

    start profiling: am profile <PROCESS> start <FILE> 
    stop profiling: am profile <PROCESS> stop 

    <INTENT> specifications include these flags: 
     [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>] 
     [-c <CATEGORY> [-c <CATEGORY>] ...] 
     [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] 
     [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...] 
     [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...] 
     [-n <COMPONENT>] [-f <FLAGS>] [<URI>] 


# am start -n com.android.browser/.BrowserActivity 
Starting: Intent { cmp=com.android.browser/.BrowserActivity } 
# 

Una vez que su aplicación se está ejecutando, utilice gdbserver --attach <pid> como si tuviera antes. Si tiene suerte, su aplicación espera alguna interacción del usuario antes de llamar a su código nativo para darle la oportunidad de adjuntar y establecer sus puntos de interrupción en GDB.

4

Google proporciona una solución oficial a su problema: "NDK-BGF

Se incluye en el NDK. IIRC, requiere que tengas una copia de gdbserver dentro de tu APK; IIRC, esto sucederá automáticamente si construyes tu APK con 'ndk-build' y especificas los argumentos apropiados.

Por favor, consulte la documentación de Google en $ NDK/docs/NDK-BUILD.html y NDK $/docs/NDK-GDB.html

</Ryan >

Cuestiones relacionadas