2010-01-13 19 views
8

Sto provando a eseguire il debug di una libreria condivisa nativa che la mia app utilizza tramite JNI. Posso collegarmi a un'app in esecuzione senza problemi con "gdbserver --attach pid", ma ho bisogno di avviare effettivamente la mia app quando lancio il comando gdbserver.Come eseguire il debug di un'app su Android con GDBSERVER?

C'è un milione di commenti su questo argomento, ma nessuno sembra chiaro in merito al modo in cui si avvia l'app. Tutti dicono semplicemente di digitare "gdbserver 10.0.2.2:1234 ./MyProgram", ma cosa è esattamente "MyProgram". È MyProgram.apk? È MyProgram.so? È un altro file che viene creato quando l'app è installata? Se è così, qual è il suo percorso?

risposta

4

Mentre è possibile sviluppare applicazioni free standing che possono essere avviate direttamente dalla shell come altri stanno descrivendo, sembra che il codice venga eseguito all'interno del framework dell'applicazione Android. Pertanto, non si dispone di un eseguibile e si dispone di un APK che contiene i file di classe Dalvik insieme ad altre risorse, incluso l'oggetto condiviso nativo.

Avvio di un'applicazione in un APK seguenti fasi

  1. Il processo system_server riceve un intento che richiede l'applicazione.
  2. Il processo di zigote viene indicato per eseguire un nuovo processo ed eseguire un metodo della classe.
  3. L'applicazione viene eseguita nel nuovo processo.

Anche se non è possibile avviare un APK direttamente passando un eseguibile gdbserver, la sua abbastanza facile da innescare un lancio dalla shell con il 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 volta che l'applicazione è in esecuzione, utilizzare gdbserver --attach <pid> come avete davanti. Se sei fortunato, la tua applicazione attende l'interazione dell'utente prima di chiamare il tuo codice nativo per darti la possibilità di allegare e impostare i tuoi punti di interruzione in GDB.

4

Google fornisce una soluzione ufficiale al problema: 'NDK-gdb'

E 'incluso nel NDK. IIRC, richiede che tu abbia una copia di gdbserver in bundle all'interno del tuo APK; IIRC, questo avverrà automaticamente se hai costruito il tuo APK con 'ndk-build' e specificato gli argomenti appropriati.

Si prega di consultare la documentazione di Google nel $ NDK/docs/NDK-BUILD.html e $ NDK/docs/NDK-GDB.html

</Ryan >

Problemi correlati