2010-01-13 4 views
8

J'essaie de déboguer une bibliothèque partagée native que mon application utilise via JNI. Je peux joindre à une application en cours d'exécution très bien avec "gdbserver --attach pid" mais je dois réellement lancer mon application lorsque je lance la commande gdbserver.Comment déboguer une application sur Android avec GDBSERVER?

Il y a un million d'articles sur ce sujet, mais aucun d'entre eux ne semble indiquer clairement comment lancer votre application. Ils disent tous qu'il suffit de taper "gdbserver 10.0.2.2:1234 ./MyProgram" mais qu'est-ce que "MyProgram". Est-ce que MyProgram.apk? Est-ce MyProgram.so? Est-ce un autre fichier qui est créé lorsque l'application est installée? Si oui, quel est son chemin?

Répondre

4

Bien qu'il soit possible de développer des applications autonomes qui peuvent être lancées directement à partir du shell comme d'autres le décrivent, il semble que votre code fonctionne dans le cadre de l'application Android. Par conséquent, vous n'avez pas d'exécutable et vous disposez à la place d'un fichier APK contenant vos fichiers de classe Dalvik avec d'autres ressources, y compris votre objet partagé natif.

Lancement d'une application dans un APK implique plusieurs étapes

  1. Le processus de system_server reçoit l'intention de demander votre demande.
  2. Le processus zygote reçoit l'instruction de lancer un nouveau processus et d'exécuter une méthode de votre classe.
  3. Votre application s'exécute dans le nouveau processus.

Alors que vous ne pouvez pas lancer un APK directement par le passage d'un exécutable à gdbserver, son assez facile à déclencher un lancement depuis le shell en utilisant la commande 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 } 
# 

Une fois votre application est en cours d'exécution, utilisez gdbserver --attach <pid> comme vous avez avant. Si vous êtes chanceux, votre application attend une interaction de l'utilisateur avant d'appeler votre code natif pour vous donner une chance d'attacher et de définir vos points d'arrêt dans GDB.

4

Google fournit une solution officielle à votre problème: 'NDK-gdb'

Il est inclus dans le NDK. IIRC, il exige que vous ayez une copie de gdbserver empaquetée dans votre APK; IIRC, cela se fera automatiquement si vous avez construit votre fichier APK avec 'ndk-build', et spécifié les arguments appropriés.

S'il vous plaît voir la documentation de Google en $ NDK/docs/NDK-BUILD.html et NDK $/docs/NDK-GDB.html

</ryan >

Questions connexes