Utiliser des débogueurs

Cette page fournit des informations détaillées à l'aide de LLDB pour le développement de systèmes d'exploitation. Pour en savoir plus sur le développement d'applications, consultez Déboguer votre application à la place, qui explique comment utiliser l'IUG Android Studio (basée sur LLDB).

GDB n'est plus compatible ni fourni. Si vous passez de GDB à LLDB, vous devez commencez probablement par lire Tutoriel LLDB Si vous êtes un utilisateur GDB expert, Mappage de commandes GDB vers LLDB est très utile lors de la transition.

Prérequis

Pour utiliser un débogueur:

  • Configurez l'environnement de compilation à l'aide de la commande envsetup.sh habituelle.
  • Exécutez la même commande lunch que celle utilisée lors de la compilation. Notez que le déjeuner doit correspondre exactement à l'appareil que vous déboguez. Si le plat ne correspond pas à l'appareil connecté, un message d'erreur s'affiche sous la forme suivante: You used the wrong lunch: TARGET_PRODUCT (aosp_arm64) does not match attached device (xyzabc)
  • Connectez votre appareil à la machine.

Si vous avez besoin d'aide pour configurer votre environnement, consultez Configurez l'environnement.

Déboguer un binaire

Pour déboguer un binaire créé sur votre machine, vous devez d'abord le copier sur l'appareil puis lancez le débogueur. Exemple :

adb push test.exe /data/local/tmp/test.exe
lldbclient.py --port 5038 -r /data/local/tmp/test.exe

Déboguer les applications ou processus en cours d'exécution

Pour vous connecter à une application ou à un daemon natif en cours d'exécution, utilisez lldbclient.py par un PID. Par exemple, pour déboguer le processus avec PID 1234, exécutez cette commande sur l'hôte:

lldbclient.py -p 1234

Le script configure le transfert de port, lance le processus bouchon de débogage à distance sur l'appareil, démarre le débogueur sur l'hôte, le configure pour trouver les symboles et connecte au bouchon de débogage distant.

Déboguer le démarrage du processus natif

Pour déboguer un processus en cours de démarrage, utilisez lldbclient.py avec -r . Par exemple, pour déboguer ls /bin, exécutez la commande suivante sur l'hôte:

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

Saisissez ensuite continue à l'invite du débogueur.

Déboguer le démarrage de l'application

Parfois, vous souhaitez déboguer une application au démarrage (en cas de plantage, par exemple). et que vous voulez parcourir le code pour voir ce qui s'est passé avant le plantage. Dans certains cas, il est possible d'associer impossible car l'application plante avant que vous ne puissiez joindre. La Approche logwrapper (utilisée pour strace) ne fonctionne pas toujours, car il est possible que l'application ne dispose pas les autorisations nécessaires pour ouvrir un port, et lldbserver hérite de ce ou d'une restriction d'accès.

Pour déboguer le démarrage de l'appli, utilisez les options pour les développeurs dans les paramètres pour demander à l'application d'attendre l'association d'un débogueur Java:

  1. Accédez à Paramètres > Options pour les développeurs > Sélectionnez l'application de débogage, puis choisissez votre application dans la liste, puis cliquez sur Attendre le débogueur.
  2. Démarrez l'application à partir du lanceur d'applications ou à l'aide de la ligne de commande suivante:
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. Attendez que l'application soit chargée et qu'une boîte de dialogue s'affiche pour vous indiquer qu'elle est en attente d'un débogueur.
  4. Joindre lldbserver/lldbclient normalement, définir des points d'arrêt, puis continuez le processus.

Pour permettre à l'application de s'exécuter, joignez un protocole 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éboguer des applications ou des processus qui plantent

Si vous voulez que debuggerd suspende les processus plantés afin que vous puissiez et joindre 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 ou version antérieure
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow et versions antérieures
    adb shell setprop debug.db.uid 999999
    

À la fin de la sortie de plantage habituelle, debuggerd permet d'effectuer un copier-coller des instructions dans Logcat montrant comment connecter le débogueur au processus interrompu.

Déboguer avec VS Code

LLDB prend en charge le débogage du code de la plate-forme 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 <ph type="x-smartling-placeholder"></ph> Extension CodeLLDB

Pour déboguer du code avec VS Code:

  1. Assurez-vous que tous les artefacts de compilation (tels que les symboles) requis pour s'exécuter lldbclient.py ou lldbclient.py sont présents.
  2. Dans VS Code, appuyez sur Ctrl+Maj+P pour exécuter une commande, puis recherchez Debug (Déboguer) : Ajouter une configuration..., puis sélectionnez LLDB. Un fichier launch.json s'ouvre et un nouvel objet JSON est ajouté à une liste.
  3. Remplacez la configuration de débogueur nouvellement ajoutée par deux lignes de commentaire : // #lldbclient-generated-begin et // #lldbclient-generated-end. que votre liste de configuration se présente comme suit:
    "configurations": [
        // #lldbclient-generated-begin
        // #lldbclient-generated-end
    ]

    lldbclient.py utilise ces commentaires pour détecter où écrire la configuration. S'il y a sont d'autres éléments dans la liste, ajoutez les lignes de commentaire à la fin après les autres configurations.

  4. Exécutez la commande suivante dans le terminal où vous avez exécuté envsetup.sh et lunch:
    lldbclient.py --setup-forwarding vscode-lldb \
          --vscode-launch-file LAUNCH_JSON_PATH \
          ANY_OTHER_FLAGS -p pid | -n proc-name | -r ...

    lldbclient.py écrit la configuration générée dans launch.json et continue de s'exécuter. C'est normal. ne arrêtez pas le programme lldbclient.py. Si vous omettez --vscode-launch-file. Le script affichera l'extrait de code JSON que vous vous devrez copier et coller manuellement dans launch.json.

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

  5. Ouvrez la barre latérale Run and Debug (Exécuter et déboguer). La nouvelle configuration doit apparaître dans le de la liste des débogueurs. Appuyez sur Démarrer le débogage (F5). Le débogueur devrait se connecter après de 10 à 30 secondes.

    Si la nouvelle configuration n'apparaît pas dans la vue "Run and Debug" (Exécuter et déboguer), actualisez la fenêtre pour Pour actualiser la liste des débogueurs, appuyez sur Ctrl + Maj + P, puis saisissez reload window

  6. Lorsque vous avez terminé le débogage, accédez au terminal exécutant lldbclient.py et appuyez sur Entrée pour mettre fin à la Programme lldbclient.py. Les exécutions ultérieures du script généreront la configuration entre les commentaires #lldbclient-generated et remplacer l'ancien contenu, vous ne devez pas vous devrez les supprimer manuellement.

Pour ajouter des propriétés personnalisées à la configuration de lancement générée, vous pouvez utiliser la méthode --vscode-launch-props. Par exemple:

lldbclient.py --setup-forwarding vscode-lldb \
    --vscode-launch-props \
    '{"initCommands" : ["script print(\"Hello\")"], "preLaunchTask" : "Build"}' \
    ...
Avec ces exemples de propriétés, VS Code exécute une tâche nommée Build avant le débogage et ajoute une étape d'initialisation de débogage aux étapes générées par le script. Vous trouverez des propriétés disponibles <ph type="x-smartling-placeholder"></ph> dans la documentation VS Code et dans le manuel utilisateur <ph type="x-smartling-placeholder"></ph> Extension CodeLLDB.