Guide de démarrage rapide: déboguer une application Python à l'aide de Cloud Debugger

Déboguer une application Python à l'aide de Cloud Debugger

Ce guide de démarrage rapide explique comment déboguer l'état d'une application Python simple s'exécutant sur App Engine à l'aide de Cloud Debugger. Il décrit comment effectuer les tâches suivantes :

  • Inspecter les variables locales et la pile d'appel
  • Générer des instructions de journalisation
  • Définir des conditions d'instantané et utiliser des expressions

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  4. Installez Google Cloud CLI.
  5. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  6. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  7. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  8. Installez Google Cloud CLI.
  9. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  10. Assurez-vous que les logiciels suivants sont installés sur votre système local :

Déployer l'exemple d'application sur App Engine

Commencez par déployer une application Python 3.7 sur App Engine.

  1. Clonez l'application sur votre ordinateur local :

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. Accédez au répertoire qui contient l'application :

    cd python-docs-samples/appengine/standard_python3/cloud_debugger
    
  3. Déployez l'application sur App Engine en exécutant la commande suivante :

    gcloud app deploy
    

    Lorsque vous y êtes invité, sélectionnez la région dans laquelle vous souhaitez déployer votre application App Engine.

  4. Affichez l'application en exécutant la commande suivante :

    gcloud app browse
    

    Si l'application ne s'affiche pas automatiquement dans une nouvelle fenêtre de navigateur, cliquez sur l'URL qui s'affiche dans le terminal.

    L'application contient une invite dans laquelle figure un champ pré-rempli.

    L'exemple d'application affiche un bouton d'envoi et le champ prérempli avec abcd.

  5. Cliquez sur Submit (Envoyer).

    L'exemple d'application affiche deux résultats : le résultat du programme et le résultat correct.

Après avoir cliqué sur "Submit" (Envoyer), deux résultats s'affichent. Le premier est intitulé Program Output (Résultat du programme) et affiche le résultat de la méthode Reverse dans le code source. Le second porte la mention Correct Output (Résultat correct) et correspond au résultat de la fonctionnalité Python d'inversion de liste.

Les valeurs pour Program Output (Résultat du programme) et Correct Output (Résultat correct) doivent être identiques. Il y a toutefois un problème au niveau du code source. Diagnostiquez-le à l'aide de Debugger.

Afficher le code source déployé

Une fois votre application déployée, vous pouvez afficher le code source déployé sur la page Débogage de Google Cloud Console.

  1. Accédez à la page Débogage de Google Cloud Console:

    Accéder à la page "Débogage"

  2. Assurez-vous d'avoir sélectionné le bon projet :

    Le menu déroulant de sélection du projet est en surbrillance et montre que le bon projet est sélectionné.

  3. Assurez-vous que Debugger a bien accès aux fichiers déployés. Pour cela, vérifiez que l'option Deployed Files (Fichiers déployés) est sélectionnée et que les fichiers de l'application sont présents :

    Le menu déroulant montre que l'option "Deployed files" (Fichiers déployés) est sélectionnée.

  4. Assurez-vous que la bonne version de l'application est sélectionnée :

    Le menu déroulant montre que la bonne version de l'application est sélectionnée.

    App Engine conserve toutes les versions déployées d'une application. Lorsque vous utilisez Debugger, vérifiez que la bonne version de l'application est sélectionnée.

    Une fois le fichier main.py sélectionné, le bloc de code suivant s'affiche :

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    import logging
    logging.basicConfig(level=logging.INFO)
    

    Cette section importe et active l'agent Debugger à l'aide d'un bloc try-except :

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    La section suivante configure la journalisation :

    import logging
    logging.basicConfig(level=logging.INFO)
    

Vous êtes maintenant prêt à prendre des instantanés de débogage et à injecter des points de journalisation de débogage pour diagnostiquer le problème dans le code source.

Prendre un instantané de débogage

Un instantané de débogage capture la pile d'appel et les variables locales disponibles au niveau d'une ligne spécifique.

  1. Pour prendre un instantané de débogage, cliquez sur le numéro de la ligne contenant la variable tmp. Une flèche bleue apparaît, indiquant qu'un instantané est défini, et le panneau des résultats affiche "Waiting for snapshot to hit" (En attente d'un instantané).

    L'interface Debugger indique qu'un instantané est défini à la ligne 47.

  2. Pour déclencher votre instantané, actualisez la page.

    Le volet Variables affiche les valeurs des variables. Vérifiez que le tableau chars a correctement été renseigné lors du premier passage dans la boucle. Le problème n'est pas présent ici, car l'instantané a été pris à la première apparition du point d'arrêt.

    Le panneau des résultats affiche les valeurs des variables après la création de l'instantané.

    Le volet Call Stack (Pile d'appel) affiche les résultats de la pile d'appel. Vous pouvez cliquer sur les fonctions du volet Call Stack (Pile d'appel) pour afficher les variables et paramètres locaux à ce stade du code. Lorsque vous cliquez sur ReverseString, vous constatez que l'entrée était correcte.

    Le panneau des résultats affiche les valeurs de la pile d'appel après la création de l'instantané.

Comme la prise d'un instantané, ainsi que l'inspection des variables et de la pile d'appel, n'a pas permis de détecter le problème, nous allons utiliser des points de journalisation.

Injecter un point de journalisation de débogage

Un point de journalisation de débogage vous permet d'injecter une journalisation dans votre application en cours d'exécution sans avoir à la redémarrer.

  1. Pour insérer un point de journalisation, sélectionnez l'onglet Point de journalisation.

  2. Cliquez sur le numéro de la ligne contenant la variable tmp. Une zone de texte intégrée apparaît. Renseignez les champs comme suit, puis cliquez sur Ajouter :

    if (True) logpoint("About to swap two characters. Chars is currently {chars}")
    

    Un point de journalisation est défini à la ligne 47.

    Un point de journalisation présente la structure suivante : if(condition)logpoint(string). Pour créer un point de journalisation, vous devez fournir deux éléments :

    • Une condition, qui doit être écrite dans la syntaxe du code source

    • Une chaîne, qui peut contenir un nombre illimité d'expressions placées entre accolades et écrites dans la syntaxe du code source

  3. Pour vérifier que le point de journalisation a bien été injecté, sélectionnez l'onglet Logpoint History (Historique des points de journalisation).

    Cet onglet montre qu'un point de journalisation a été défini à la ligne 18.

  4. Pour déclencher le point de journalisation, actualisez la page.

  5. Pour afficher les journaux générés par le point de journalisation, sélectionnez l'onglet Logs (Journaux), puis cliquez sur le bouton d'actualisation .

    Cet onglet affiche le résultat du point de journalisation.

Diagnostiquer le problème

Les points de journalisation indiquent que la boucle while s'exécute trois fois, mais qu'elle ne doit être exécutée que deux fois. Comme le point de journalisation est défini au début de la boucle, il a émis des journaux indiquant que l'application était sur le point de transposer les caractères d'une chaîne déjà inversée.

Les journaux indiquent que la boucle "while" a été exécutée trois fois.

Pour identifier le problème, utilisez un instantané de débogage avec une condition.

Prendre un instantané de débogage à l'aide d'une condition

L'application utilise les variables left et right pour savoir quand arrêter la transposition de valeurs. Lorsque la valeur de left est supérieure à celle de right, la boucle doit s'arrêter.

Les instantanés peuvent être définis de manière à se déclencher lorsqu'une condition est satisfaite dans le code source. Dans la mesure où vous savez quand la boucle doit se terminer, utilisez un instantané avec une condition pour isoler le problème.

  1. Pour déterminer pourquoi la boucle s'exécute un trop grand nombre de fois, définissez l'instantané afin qu'il se déclenche lorsque la condition suivante est satisfaite : left > right. Cliquez ensuite sur l'icône d'appareil photo  pour préparer Debugger à prendre l'instantané.

    Un instantané est défini à la ligne 47 à l'aide d'une instruction conditionnelle.

  2. Déclenchez l'instantané en actualisant la page. Le volet Variables indique que la valeur de left est supérieure à celle de right.

    Comme la valeur de la variable left est déjà supérieure à celle right à ce stade de la boucle, elle transpose les valeurs une fois de plus avant d'atteindre la ligne 50 et de quitter la boucle.

    Le volet des variables affiche les valeurs des variables.

Prendre un instantané de débogage en utilisant une expression

Debugger vous permet également de récupérer des expressions de langage de programmation lors du déclenchement de l'instantané. Par exemple, vous pouvez obtenir les valeurs du tableau chars en utilisant des expressions telles que chars[1] et chars[2].

  1. Pour obtenir la valeur d'une expression lors du déclenchement d'un instantané, écrivez l'expression dans le champ Expression. Vous pouvez saisir plusieurs expressions.

    Après le déclenchement de l'instantané, les valeurs des expressions apparaissent au-dessus du volet Variables.

    Les résultats du champ d'expression indiquent les valeurs c et b.

Résoudre le problème

Les instantanés et les points de journalisation permettent de diagnostiquer le problème dans l'application. Dans cet exemple, la boucle while s'exécute un trop grand nombre de fois, car l'instruction qui arrête la boucle (if left >= right: break) apparaît trop tard pour arrêter la dernière itération. Pour résoudre le problème, déplacez if left >= right: break de la ligne 50 à la ligne 47.

Effectuer un nettoyage

Afin d'éviter que des frais ne soient facturés sur votre compte Google Cloud pour les ressources utilisées sur cette page, procédez comme suit :

  1. Accédez à la page Projets de la console Google Cloud.

  2. Cliquez sur Supprimer à côté de votre projet.

  3. Saisissez le nom du projet pour confirmer l'arrêt.

Étapes suivantes