Débogage des Rails avec le Débogueur Pry

Partie 3 de la série Un Guide complet du Débogage des Rails

Débogage des Rails avec Pry

Si vous ne savez pas encore ce qu’est une session de débogage, considérez-le comme ouvrant la console Rails à un point choisi dans le chemin d’exécution.

Je suppose ci-dessous que vous avez installé le débogueur Pry et les gemmes pry-stack_explorer.

À tout moment de votre code source (y compris dans le code téléchargé des gemmes incluses dans votre Gemfile et facilement ouvertes dans l’éditeur de texte avec bundle open gem_name), vous pouvez insérer la liaison de ligne.fureter. Chaque fois que l’interpréteur Ruby exécute cette ligne, il arrête ce qu’il fait et ouvre une session de REPL de levier à ce moment-là. Si vous aviez interagi avec le site Web via le navigateur, vous devrez passer de programmes à l’onglet console de terminal dans lequel votre serveur Rails fonctionnait pour que vous puissiez voir la session de levier.

Pour plus de clarté dans l’explication de ce qui suit, j’inclus un extrait de code ici.

def place_everyone_on_sale Seller.all.each do |seller| place_on_sale(seller) endenddef place_on_sale(seller) binding.pry # Execution will stop here. new_products = generate_products(seller) new_product.advertise new_productsenddef generate_products(seller) seller.documents.each do |document| document.place_online if document.releasable endend

Dans votre console Pry, vous avez déjà toutes les fonctionnalités mentionnées pour inspecter l’état ou introspecter votre programme avec des produits ls. Le débogage ajoute une navigation de pile à travers les cadres de pile. Permet de mentir un peu et de définir un cadre de pile comme une « console de REPL ouverte à l’un des points possibles le long de la trace de pile Pourquoi pourrions-nous vouloir naviguer dans les cadres de pile? Pour identifier davantage notre erreur en recherchant des causes plus spécifiques. Nous le faisons parfois en recherchant le moment où une certaine variable change de valeur (par exemple, un cookie est défini). D’autres fois, nous naviguons pour observer le flux d’exécution, en comparant ce que nous attendons avec ce que nous voyons. Par exemple, vous remarquerez peut-être que la mauvaise branche d’une construction if-else a été exécutée.

Après avoir exécuté place_everything_on_sale dans l’extrait de code ci-dessus, vous vous retrouverez lancé dans une session de levier dans la méthode place_on_sale et vous poserez une question sur ce que vous souhaitez faire ensuite.

  • La commande step continue l’exécution en vous déplaçant dans la méthode sur la ligne suivante, en changeant votre cadre de pile pour qu’il soit à l’intérieur de cette méthode. Formulé d’une autre manière, il va plus loin. En suivant notre exemple de code, l’exécution de step vous amènera dans la méthode generate_products, à quel moment on vous demandera ce que vous souhaitez faire ensuite.

  • Vous êtes « entré » dans la méthode generate_products avec step ci-dessus, mais maintenant vous avez décidé de passer à la fin de la méthode generated_products sans que le débogueur vous demande votre choix de commande de navigation après chaque ligne. Tapez finish pour exécuter jusqu’à ce que le cadre de pile actuel ait exécuté chaque ligne, fermé et renvoie une valeur, faisant ainsi surface d’un niveau, qui revient dans le cadre de pile dont vous étiez précédemment sorti. En suivant l’exemple, cela vous ramène à la méthode place_on_sale au point après que l’interpréteur a évalué generated_products.

  • La commande suivante exécute la ligne courante et passe à la ligne ou à la méthode suivante dans le contexte courant, c’est-à-dire progressant sans changer le cadre de pile. Formulé d’une autre manière, continuez une ligne vers le bas de la méthode actuelle sans aller plus loin. En regardant l’exemple de code (et en prétendant que nous venions de redémarrer notre programme, d’exécuter place_everything_on_sale et d’ouvrir une session de levier), taper next exécutera complètement generate_products sans vous laisser tomber dans ses éléments internes, puis il affectera la valeur de retour à la variable new_products. Les étapes suivantes sont plus grandes que les étapes, ou en termes de Rails, une étape suivante has_many. Tout le code de la méthode generate_products (qui serait autrement de nombreuses étapes), a été conclu avec une seule utilisation de la commande next. Votre prochaine décision de navigation sera de savoir s’il faut passer, ensuite à new_product.advertise.

  • Abandonnez la session de levier et continuez l’exécution du programme normalement avec la commande continue. Si l’interpréteur rencontre une autre liaison.instruction pry, (ce qui se produira lorsque vous appelez la méthode place_everyone_on_sale ci-dessus), elle exécutera la méthode place_on_sale une fois pour chaque vendeur, ouvrant donc une session Pry à chaque itération. Cela peut être incroyablement ennuyeux, car votre programme s’arrêtera et vous devrez naviguer dans le débogueur à chaque fois, vous voudrez donc probablement taper exit-program pour annuler l’effet de toute liaison suivante.instructions de levier, sans, pour ainsi dire, quitter votre programme Rails.

  • Affichez le code source de la méthode dans laquelle vous vous trouvez actuellement: whereami Idéal pour confirmer que vous êtes dans la bonne classe ou pour voir où vous vous êtes retrouvé après avoir parcouru quelques images dans votre session de débogage.

  • Imprimer et naviguer dans la pile d’appels Lorsqu’une exception est levée dans Ruby, elle imprime une trace de pile de toutes les méthodes appelées avant cette exception. Parfois, vous souhaitez afficher la trace de la pile jusqu’à présent malgré l’absence d’exception levée. Grâce à une extension de levier particulière installée en ajoutant la gemme pry-stack_explorer, vous pouvez le faire avec show-stack -v. Cette commande affiche la trace de la pile, indiquant la trame actuelle avec une flèche. Vous pouvez naviguer vers une autre image avec up ou « up{n} », par exemple up 3 pour monter trois images, c’est-à-dire déplacer votre REPL dans le contexte de la méthode qui a appelé la méthode (et ainsi de suite…) qui a finalement appelé la méthode dans laquelle vous êtes actuellement placé. Tapez show-stack pour voir où vous vous êtes déplacé dans la pile, et vers le bas pour déplacer les images dans la direction opposée.

  • Quitter le contexte avec une valeur: Parfois, vous souhaitez manipuler le flux de programme en renvoyant une certaine valeur à partir d’une session de levier. Pour un exemple tendu, imaginez que vous aviez une ligne de code qui lisait first_name = binding.pry. La variable first_name reçoit la sortie de la session de levier, et vous pouvez définir cette valeur sur jack avec exit "jack".

Parfois, vous souhaitez spécifier exactement quand la liaison.pry ouvrira une session de levier. Je le fais avec des conditions de code Ruby:

 binding.pry if session == true binding.pry if @first_name == "Jack" binding.pry if iteration > 4

Partie 3 de la série Un Guide complet du Débogage des Rails Débogage des Rails avec Pry Si vous ne savez pas encore ce qu’est une session de débogage, considérez-le comme ouvrant la console Rails à un point choisi dans le chemin d’exécution. Je suppose ci-dessous que vous avez installé le débogueur Pry et les…

Partie 3 de la série Un Guide complet du Débogage des Rails Débogage des Rails avec Pry Si vous ne savez pas encore ce qu’est une session de débogage, considérez-le comme ouvrant la console Rails à un point choisi dans le chemin d’exécution. Je suppose ci-dessous que vous avez installé le débogueur Pry et les…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.