Google is committed to advancing racial equity for Black communities. See how.
Cette page a été traduite par l'API Cloud Translation.
Switch to English

Utilisation 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 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:

  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 à 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
    
  3. 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.
  4. 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:

  1. Assurez-vous que tous les artefacts de construction (tels que les symboles) requis pour exécuter gdbclient.py ou lldbclient.py sont présents.
  2. 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 programme lldbclient.py .

  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 doit 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 .