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. P>
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? P>
3 Réponses :
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>
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 }
#
Google fournit une solution officielle à votre problème: 'ndk-gdb' p>
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. P>
Veuillez voir la documentation de Google en $ NDK / DOCS / NDK-Build.html et $ NDK / DOCS / NDK-GDB.HTML P>
ryan> p>
Pour l'exécutable GDBServer, je viens de la copier dans le dossier NDK du SDK Android: P>
ADB Push {Android-SDK} / NDK / {Version} / Prebuilt / Android-Arm64 / GDBSERVER / GDBSERVER / DATA / LOCAL / TMP CODE> LI>
ol>
Pour exécuter GDBServer, avec le périphérique branché: p>
-
adb shell su -c setenforce 0 code> li>
- Dans l'appareil, acceptez les droits d'accès superutilisateur de Shell LI>
- Lancez l'application que vous souhaitez déboguer li>
-
adb shell ps | grep {nom du paquet} code> li>
- Copiez l'ID de processus (2e colonne) LI>
-
joke adb code> li>
-
CD / DATA / LOCAL / TMP CODE> LI>
-
su -c ./gdbServer: --attach code> (application gelera) li>
ol>
Pour l'exécutable GDBClient, je devais le construire à partir du code source GDB a > Pour configurer l'architecture correcte (Arm64) pour le périphérique Android. Sur une fenêtre de terminal Mac séparé / Tab: P>
-
cd gdb-10.1 code> li>
-
./ configure --target = aarch64-linux-android && make -j8 && sudo fait installer code> li>
-
aarch64-linux-android-gdb code> li>
-
SYSROOT CODE> LI>
-
Remote cible : CODE> LI>
-
Continuer code> (à une application de liberge) li>
- Démarrer le débogage. LI>
ol>