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
- 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.
-
Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.
-
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.
- Installez Google Cloud CLI.
-
Pour initialiser gcloudCLI, exécutez la commande suivante :
gcloud init
-
Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.
-
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.
- Installez Google Cloud CLI.
-
Pour initialiser gcloudCLI, exécutez la commande suivante :
gcloud init
- 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.
Clonez l'application sur votre ordinateur local :
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Accédez au répertoire qui contient l'application :
cd python-docs-samples/appengine/standard_python3/cloud_debugger
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.
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.
Cliquez sur Submit (Envoyer).
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.
Accédez à la page Débogage de Google Cloud Console:
Assurez-vous d'avoir sélectionné le bon projet :
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 :
Assurez-vous 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.
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é).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 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.
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.
Pour insérer un point de journalisation, sélectionnez l'onglet Point de journalisation.
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 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
Pour vérifier que le point de journalisation a bien été injecté, sélectionnez l'onglet Logpoint History (Historique des points de journalisation).
Pour déclencher le point de journalisation, actualisez la page.
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 refresh.
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.
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.
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 camera_alt pour préparer Debugger à prendre l'instantané.Déclenchez l'instantané en actualisant la page. Le volet Variables indique que la valeur de
left
est supérieure à celle deright
.Comme la valeur de la variable
left
est déjà supérieure à celleright
à ce stade de la boucle, elle transpose les valeurs une fois de plus avant d'atteindre la ligne 50 et de quitter la boucle.
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]
.
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.
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 :
Accédez à la page Projets de la console Google Cloud.
Cliquez sur Supprimer deleteà côté de votre projet.
Saisissez le nom du projet pour confirmer l'arrêt.
Étapes suivantes
Obtenez plus d'informations sur la configuration de Debugger.
Approfondissez vos connaissances sur l'utilisation de Debugger.
Consultez nos ressources sur DevOps et découvrez notre programme de recherche.