Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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.logafin que le répertoire.__override__soit créé. - Incluez
gdbserverdans 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
gdbserverdans 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
gdbserverlibs/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
gdbserveraccessible.
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.