8
votes

Comment déboguer une application sur Android avec GDBServer?

J'essaie de déboguer une bibliothèque partagée native que mon application utilise à travers JNI. Je peux m'attacher à une application en cours d'exécution simplement avec "gdbserver --attach pid" mais j'ai besoin de lancer mon application lorsque je lance la commande gdbserver.

Il y a un million de blogs sur ce sujet, mais aucun d'entre eux ne semble être clair sur la manière dont vous lancez votre application. Ils disent tous simplement à taper "gdbserver 10.0.2.2:1234 ./myprogram" mais qu'est-ce que "myprogram". Est-ce myProgram.apk? Est-ce myprogram.so? Est-ce un autre fichier créé lorsque l'application est installée? Si oui, quel est son chemin?


0 commentaires

3 Réponses :


5
votes

S'il est possible de développer des applications libres pouvant être lancées directement à partir de la coque, car d'autres décrivent, on dirait que votre code est exécuté dans le cadre d'application Android. Par conséquent, vous n'avez pas d'exécutable et disposez plutôt d'un APK contenant vos fichiers de classe Dalvik avec d'autres ressources, y compris de votre objet partagé natif.

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

  1. Le processus System_Server reçoit une intention demandant votre application. LI>
  2. Le processus zygote est dit de faire une fourchette d'un nouveau processus et d'exécuter une méthode de votre classe. Li>
  3. Votre application fonctionne dans le nouveau processus. LI> ol>

    Bien que vous ne puissiez pas lancer d'APK directement en passant une exécutable à GDBSERVER, c'est assez facile à déclencher un lancement de la coquille à l'aide de la commande am code>. p>

    $ 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 }
    #
    


0 commentaires

4
votes

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

Il est inclus dans le NDK. IIRC, cela nécessite que vous ayez une copie de GDBServer groupée dans votre APK; IIRC, cela se produira automatiquement si vous avez construit votre APK avec «NDK-Build» et spécifié les arguments appropriés.

Veuillez voir la documentation de Google en $ NDK / DOCS / NDK-Build.html et $ NDK / DOCS / NDK-GDB.HTML


0 commentaires

1
votes

Pour l'exécutable GDBServer, je viens de la copier dans le dossier NDK du SDK Android:

  1. Téléchargez Android NDK à partir de l'onglet Outils SDK de Android Studio Préférences.
  2. Copiez GDBServer sur le périphérique enraciné: ADB Push {Android-SDK} / NDK / {Version} / Prebuilt / Android-Arm64 / GDBSERVER / GDBSERVER / DATA / LOCAL / TMP

    Pour exécuter GDBServer, avec le périphérique branché:

    1. adb shell su -c setenforce 0
    2. Dans l'appareil, acceptez les droits d'accès superutilisateur de Shell
    3. Lancez l'application que vous souhaitez déboguer
    4. adb shell ps | grep {nom du paquet}
    5. Copiez l'ID de processus (2e colonne)
    6. joke adb
    7. CD / DATA / LOCAL / TMP
    8. su -c ./gdbServer: --attach (application gelera)

      Pour l'exécutable GDBClient, je devais le construire à partir du code source GDB Pour configurer l'architecture correcte (Arm64) pour le périphérique Android. Sur une fenêtre de terminal Mac séparé / Tab:

      1. cd gdb-10.1
      2. ./ configure --target = aarch64-linux-android && make -j8 && sudo fait installer
      3. aarch64-linux-android-gdb
      4. SYSROOT
      5. Remote cible :
      6. Continuer (à une application de liberge)
      7. Démarrer le débogage.

0 commentaires