Cette page détaille l'utilisation de LLDB ou GDB pour le développement du système d'exploitation. Pour le développement d'applications, consultez plutôt Déboguer votre application , qui explique comment utiliser l'interface graphique d'Android Studio (basée sur LLDB).
GDB est obsolète et sera bientôt supprimé. Si vous passez de GDB à LLDB, vous devriez probablement commencer par lire le didacticiel LLDB . Si vous êtes un utilisateur expert de GDB, la mappe de commandes GDB vers LLDB est très utile lors de la transition.
Conditions préalables
Pour utiliser un débogueur:
- Configurez l'environnement de construction avec la commande habituelle
envsetup.sh
. - Exécutez la même commande de
lunch
vous avez utilisée lors de la construction.
Pour plus d'informations sur la configuration de votre environnement, voir Configurer l'environnement .
Débogage d'applications ou de processus en cours d'exécution
Pour vous connecter à une application en cours d'exécution ou à un démon natif, utilisez gdbclient.py
avec un PID. Par exemple, pour déboguer le processus avec PID 1234, exécutez:
gdbclient.py -p 1234
Le script configure la redirection de port, démarre le stub de débogage distant approprié sur le périphérique, démarre le débogueur sur l'hôte, le configure pour trouver des symboles et le connecte au stub de débogage distant.
Débogage du démarrage du processus natif
Pour déboguer un processus au démarrage, utilisez gdbclient.py
avec l'option -r
:
gdbclient.py -r /system/bin/MY_TEST_APP
Ensuite, entrez continue
à l'invite du débogueur.
Démarrage de l'application de débogage
Parfois, vous souhaitez déboguer une application au démarrage, par exemple en cas de plantage et vous souhaitez parcourir le code pour voir ce qui s'est passé avant le plantage. La pièce jointe fonctionne dans certains cas, mais dans d'autres cas, elle est impossible car l'application se bloque avant que vous puissiez la joindre. L'approche logwrapper
(utilisée pour strace
) ne fonctionne pas toujours car l'application peut ne pas avoir les autorisations pour ouvrir un port et gdbserver
hérite de cette restriction.
Pour déboguer le démarrage de l'application, utilisez les options de développement dans Paramètres pour indiquer à l'application d'attendre qu'un débogueur Java se connecte:
- Accédez à Paramètres> Options pour les développeurs> Sélectionnez l'application de débogage et choisissez votre application dans la liste, puis cliquez sur Attendre le débogueur .
- Démarrez l'application, soit à partir du lanceur, soit en utilisant la ligne de commande pour exécuter:
adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
- Attendez que l'application se charge et qu'une boîte de dialogue s'affiche pour vous indiquer que l'application attend un débogueur.
- Attachez normalement
gdbserver
/gdbclient
, définissez des points d'arrêt, puis poursuivez le processus.
Pour permettre à l'application de s'exécuter, associez un débogueur JDWP (Java Debug Wire Protocol) tel que Java Debugger (jdb):
adb forward tcp:12345 jdwp:XXX # (Where XXX is the PID of the debugged process.)
jdb -attach localhost:12345
Débogage d'applications ou de processus qui plantent
Si vous voulez que debuggerd
suspende les processus en panne afin de pouvoir attacher un débogueur, définissez la propriété appropriée:
- Android 7.0 Nougat et supérieur
adb shell setprop debug.debuggerd.wait_for_gdb true
- Android 6.0 Marshmallow et inférieur
adb shell setprop debug.db.uid 999999
À la fin de la sortie de crash habituelle, debuggerd
fournit des instructions sur la façon de connecter un débogueur à l'aide de la commande:
gdbclient.py -p PID
Débogage sans symboles
Pour ARM 32 bits, si vous n'avez pas de symboles, gdb
ne peut pas déterminer quel jeu d'instructions il désassemble (ARM ou Thumb). Pour spécifier le jeu d'instructions choisi par défaut lorsque les informations de symbole sont manquantes, définissez la propriété suivante:
set arm fallback-mode arm # or thumb
Débogage avec VS Code
LLDB prend en charge le code de plate-forme de débogage sur Visual Studio Code . Vous pouvez utiliser l'interface du débogueur VS Code au lieu de l'interface CLI LLDB pour contrôler et déboguer le code natif s'exécutant sur les appareils.
Avant d'utiliser VS Code pour le débogage, installez l' extension CodeLLDB .
Pour déboguer le code à l'aide de VS Code:
- Assurez-vous que tous les artefacts de construction (tels que les symboles) requis pour exécuter
gdbclient.py
oulldbclient.py
sont présents. - Exécutez la commande suivante:
lldbclient.py -p pid | -n proc-name | -r ... --setup-forwarding vscode ANY_OTHER_FLAGS
Cela imprime un objet JSON et
lldbclient.py
continue de s'exécuter. Ceci est attendu; ne tuez pas le programmelldbclient.py
. - Dans l'onglet de débogage de VS Code, sélectionnez Ajouter une configuration , puis sélectionnez LLDB: Lancement personnalisé . Cela ouvre un fichier
launch.json
et ajoute un nouvel objet JSON à une liste. - Supprimez la configuration du débogueur nouvellement ajoutée.
- Copiez l'objet JSON imprimé par
lldbclient.py
et collez-le dans l'objet que vous venez de supprimer. Enregistrez les modifications. - Pour recharger la fenêtre pour actualiser la liste du débogueur, appuyez sur Ctrl + Maj + P et tapez
reload window
. - Sélectionnez la nouvelle configuration du débogueur et appuyez sur Exécuter . Le débogueur doit se connecter après 10 à 30 secondes.
- Lorsque vous avez terminé le débogage, accédez au terminal exécutant
lldbclient.py
et appuyez sur Entrée pour terminer le programmelldbclient.py
.