Utiliser des débogueurs

Cette page à l' aide de détails LLDB ou GDB pour le développement du système d'exploitation. Pour le développement d'applications, consultez Debug votre application à la place, ce qui explique comment utiliser l'interface utilisateur graphique studio Android (basé sur LLDB).

GDB est obsolète et sera bientôt supprimé. Si vous passez de GDB à LLDB, vous devriez probablement commencer par lire le LLDB Tutorial . Si vous êtes un utilisateur de GDB d'experts, la carte de commande GDB à LLDB est très utile lors de la transition.

Conditions préalables

Pour utiliser un débogueur :

  • Mettre en place l'environnement de compilation avec l'habituel envsetup.sh commande.
  • Exécutez le même lunch commande que vous avez utilisé lors de la construction.

Pour plus d' aide à configurer votre environnement, voir Etablir 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 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ébogage du démarrage du processus natif

Pour déboguer un processus comme il commence, l' utilisation gdbclient.py avec la -r option. Par exemple, pour debug ls /bin , exécutez 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 voulez déboguer une application comme il commence, par exemple quand il y a un accident et que vous voulez parcourir le code pour voir ce qui est arrivé avant l'accident. Fixation des travaux dans certains cas, mais dans d' autres cas , il est impossible parce que l'application se bloque avant de pouvoir joindre. La logwrapper approche (utilisée pour strace ) ne fonctionne pas toujours parce que l'application pourrait ne pas disposer d' autorisations pour ouvrir un port et gdbserver inherits 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 s'attache :

  1. Allez dans Paramètres> Options du développeur> Sélectionnez l' application de débogage et choisissez votre application dans la liste, puis cliquez sur Attendez débogueur.
  2. Démarrez l'application, que ce soit du lanceur ou 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. Joindre gdbserver / gdbclient normalement, ensemble des points d' arrêt, puis poursuivre 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ébogage d'applications ou de processus qui se bloquent

Si vous voulez debuggerd de suspendre les processus se sont écrasés afin que vous puissiez attacher un débogueur, définissez la propriété appropriée:

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

A la fin de la sortie habituelle accident, debuggerd fournit copier et coller des instructions à logcat montrant comment connecter le débogueur au processus écrasements.

Débogage sans symboles

Pour ARM 32 bits, si vous ne disposez pas de symboles, gdb ne peut pas déterminer quel jeu il est instruction désassemblage (ARM ou le pouce). 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 débogage du code de plate - forme de code Visual Studio . 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 le code VS pour le débogage, installez l' extension de CodeLLDB .

Pour déboguer du 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 --setup-forwarding
          vscode-lldb ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    Ce imprime un objet JSON et lldbclient.py continue de fonctionner. Ceci est attendu; ne tuez pas le lldbclient.py programme.

    Le -r drapeau doit être le dernier drapeau si elle est présente en raison de la façon dont les drapeaux sont analysés par l'outil.

  3. Dans l'onglet débogage dans le code VS, sélectionnez la configuration d'ajouter, puis sélectionnez LLDB: Lancement personnalisé. Cela ouvre un launch.json fichier et ajoute un nouvel objet JSON à une liste.
  4. Supprimez la configuration de débogueur nouvellement ajoutée.
  5. Copiez l'objet JSON imprimé par lldbclient.py et le coller dans l'objet que vous venez de supprimer. Enregistrez les modifications.
  6. Pour recharger la fenêtre pour actualiser la liste de débogage, appuyez sur Ctrl + Maj + P et le type reload window .
  7. Sélectionnez la nouvelle configuration de débogage et appuyez sur run. Le débogueur devrait se connecter après 10 à 30 secondes.
  8. Lorsque vous avez le débogage fait, allez à la bonne marche de terminal lldbclient.py et appuyez sur Entrée pour mettre fin au lldbclient.py programme.