Utiliser des débogueurs

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 Déboguer votre application à la place, 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 carte 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 lunch que vous avez utilisée lors de la construction.

Pour plus d'informations sur la configuration de votre environnement, voir Configurer l'environnement .

Déboguer des applications ou des 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 le PID 1234, exécutez ceci sur l'hôte :

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 rechercher des symboles et le connecte au stub de débogage distant.

Déboguer le démarrage du processus natif

Pour déboguer un processus au démarrage, utilisez gdbclient.py avec l'option -r . Par exemple, pour déboguer ls /bin , exécutez ceci sur l'hôte :

gdbclient.py -r /system/bin/ls /bin

Ensuite, entrez continue à l'invite du débogueur.

Débogage du démarrage de l'application

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. L'attachement fonctionne dans certains cas, mais dans d'autres cas, il est impossible car l'application se bloque avant que vous puissiez vous attacher. 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 les paramètres pour demander à l'application d'attendre qu'un débogueur Java se connecte :

  1. 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 .
  2. Démarrez l'application, soit depuis le 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
    
  3. Attendez que l'application se charge et qu'une boîte de dialogue apparaisse vous indiquant que l'application attend un débogueur.
  4. Attachez gdbserver / gdbclient normalement, définissez des points d'arrêt, puis continuez le processus.

Pour laisser l'application s'exécuter, attachez un débogueur Java Debug Wire Protocol (JDWP) 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éboguer des applications ou des processus qui se bloquent

Si vous souhaitez que debuggerd suspende les processus en panne afin de pouvoir attacher un débogueur, définissez la propriété appropriée :

  • Après Android 11
    adb shell setprop debug.debuggerd.wait_for_debugger true
    
  • Android 11 et
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow et version inférieure
    adb shell setprop debug.db.uid 999999
    

À la fin de la sortie de plantage habituelle, debuggerd fournit des instructions de copier-coller dans logcat montrant comment connecter le débogueur au processus planté.

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 sur les symboles 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 la 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 exécuté sur les appareils.

Avant d'utiliser VS Code pour le débogage, installez l' extension CodeLLDB .

Pour déboguer du code à l'aide de VS Code :

  1. Assurez-vous que tous les artefacts de génération (tels que les symboles) requis pour exécuter gdbclient.py ou lldbclient.py sont présents.
  2. Exécutez la commande suivante :
    lldbclient.py --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Cela imprime un objet JSON et lldbclient.py continue de s'exécuter. C'est prévu; ne tuez pas le programme lldbclient.py .

    L'indicateur -r doit être le dernier indicateur s'il est présent en raison de la façon dont les indicateurs sont analysés par l'outil.

  3. 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.
  4. Supprimez la configuration du débogueur nouvellement ajoutée.
  5. Copiez l'objet JSON imprimé par lldbclient.py et collez-le dans l'objet que vous venez de supprimer. Enregistrez les modifications.
  6. Pour recharger la fenêtre pour actualiser la liste du débogueur, appuyez sur Ctrl+Maj+P et tapez reload window .
  7. Sélectionnez la nouvelle configuration du débogueur et appuyez sur Exécuter . Le débogueur devrait se connecter après 10 à 30 secondes.
  8. Lorsque vous avez terminé le débogage, accédez au terminal exécutant lldbclient.py et appuyez sur Entrée pour terminer le programme lldbclient.py .