GDB
Vue d’ensemble
Xamarin.Android 4.10 a introduit la prise en charge partielle de l’utilisation de gdb
à l’aide de la cible MSBuild _Gdb
.
Notes
La prise en charge de gdb
nécessite l’installation d’Android NDK.
Il y a trois manières d’utiliser gdb
:
- Versions de débogage avec déploiement rapide activé.
- Versions de débogage avec déploiement rapide désactivé.
- Versions Release.
En cas de problème, veuillez consulter la section Dépannage.
Versions de débogage avec déploiement rapide
Lors de la création du déploiement d’une version de débogage avec déploiement rapide activé, gdb
peut être joint à l’aide de la cible MSBuild _Gdb
.
Tout d’abord, installez l’application. Vous pouvez le faire via l’IDE, ou via la ligne de commande :
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:Install *.csproj
Ensuite, exécutez la cible _Gdb
. À la fin de l’exécution, une ligne de commande gdb
s’affichera :
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
...
Target _Gdb:
"/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
...
La _Gdb
cible lancera une activité de lanceur arbitraire déclarée dans votre fichier AndroidManifest.xml
. Pour spécifier explicitement les activités à exécuter, utilisez la propriété MSBuild RunActivity
. Le démarrage des services et autres constructions Android ne sont pas pris en charge pour l’instant.
La cible _Gdb
créera un répertoire gdb-symbols
où elle copiera le contenu des répertoires /system/lib
et $APPDIR/lib
de votre cible.
Notes
Le contenu du répertoire gdb-symbols
est lié à la cible Android sur laquelle vous avez déployé et ne sera pas automatiquement remplacé si vous changez la cible. (Considérez qu’il s’agit d’un bogue.) Si vous modifiez les appareils cibles Android, vous devez supprimer manuellement ce répertoire.
Pour finir, copiez la commande gdb
générée et exécutez-la dans votre interpréteur de commandes :
$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) bt
#0 0x40082e84 in nanosleep () from /Users/jon/Development/Projects/Scratch.HelloXamarin20/gdb-symbols/libc.so
#1 0x4008ffe6 in sleep () from /Users/jon/Development/Projects/Scratch.HelloXamarin20/gdb-symbols/libc.so
#2 0x74e46240 in ?? ()
#3 0x74e46240 in ?? ()
(gdb) c
Versions de débogage sans déploiement rapide
Les versions de débogage avec déploiement rapide de fonctionnent en copiant le programme gdbserver
du NDK d’Android dans le répertoire .__override__
de déploiement rapide. Lorsque le déploiement rapide est désactivé, il est possible que ce répertoire n’existe pas.
Il y a deux manières d’y remédier :
- Définissez la propriété système
debug.mono.log
afin que le répertoire.__override__
soit créé. - Incluez
gdbserver
dans votre.apk
.
Définition de la propriété système debug.mono.log
Pour définir la propriété système debug.mono.log
, utilisez la commande adb
:
$ adb shell setprop debug.mono.log gc
Une fois que la propriété système a été définie, exécutez la cible _Gdb
et la commande imprimé gdb
, comme avec les versions de débogage à configuration de déploiement rapide :
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
...
Target _Gdb:
"/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
...
$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) c
Inclusion de gdbserver
dans votre application
Pour inclure gdbserver
dans votre application :
Recherchez
gdbserver
dans votre NDK Android (il doit se trouver dans $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver), puis copiez-le dans votre répertoire Project.Renommez
gdbserver
libs/armeabi-v7a/libgdbserver.so.Ajoutez libs/armeabi-v7a/libgdbserver.so à votre projet avec une action de génération de
AndroidNativeLibrary
.Régénérez et réinstallez votre application.
Une fois que l’application a été réinstallée, exécutez la cible _Gdb
et la commande imprimé gdb
, comme avec les versions de débogage à configuration de déploiement rapide :
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
...
Target _Gdb:
"/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
...
$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) c
Versions release
gdb
prend en charge trois opérations :
- L’autorisation
INTERNET
. - Le débogage d’application activé.
- Un
gdbserver
accessible.
L’autorisation INTERNET
est activée par défaut dans les applications de débogage. Si elle n’est pas déjà présente dans votre application, vous pouvez l’ajouter en modifiant Properties/AndroidManifest.xml, ou en modifiant les Propriétés du projet.
Le débogage de l’application peut être activé soit en définissant la propriété d’attribut personnalisé ApplicationAttribute.Debugging sur true
, soit en modifiant Properties/AndroidManifest.xml et en définissant l’attribut //application/@android:debuggable
sur true
:
<application android:label="Example.Name.Here" android:debuggable="true">
Un gdbserver
accessible peut être fourni en se référant à la section Versions de débogage sans déploiement rapide .
Une ombre au tableau : la cible MSBuild _Gdb
va tuer toutes les instances d’application préalablement exécutées. Ceci ne fonctionnera pas sur les cibles v4.0 préalables à Android.
Dépannage
mono_pmip
ne fonctionne pas
La fonction mono_pmip
(utile pour que obtienne des frames de pile managées ) est exportée à partir de libmonosgen-2.0.so
, qui n’est actuellement pas déroulé par la cible _Gdb
. (Ceci fera l’objet d’un correctif dans une version future.)
Pour activer des fonctions d’appel situées dans libmonosgen-2.0.so
, copiez-les de l’appareil cible vers le répertoire gdb-symbols
:
$ adb pull /data/data/Mono.Android.DebugRuntime/lib/libmonosgen-2.0.so Project/gdb-symbols
redémarrez ensuite votre session de débogage.
Erreur de bus : 10 lors de l’exécution de la commande gdb
Lorsque la commande gdb
échoue avec "Bus error: 10"
, redémarrez l’appareil Android.
$ "/path/to/arm-linux-androideabi-gdb" -x "Project/gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
...
Bus error: 10
$
Aucune arborescence des appels de procédure après que le répertoire a été joint
$ "/path/to/arm-linux-androideabi-gdb" -x "Project/gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
...
(gdb) bt
No stack.
C’est généralement le signe que le contenu du répertoire gdb-symbols
n’est pas synchronisé avec votre cible Android. (Avez-vous modifié votre cible Android ?)
Supprimez le répertoire gdb-symbols
et réessayez.