Programmation Ruby/Debuggueur


Le mode DEBUG

modifier

Une première façon simple de faire est d'utiliser le mode DEBUG natif à Ruby :

  • Dans votre programme, placez vos instructions (vos traces) dans un bloc conditionnel avec un test sur la constante globale $DEBUG
  • Pour lancer le script en mode debug vous pouvez
    • utiliser ruby -d mon_script.rb
    • lancer irb avec irb -d
    • dans irb, entrer la commande $DEBUG=true

Utiliser le débogueur

modifier
  Gem Ruby
ruby-breackpoint

Le débogueur est très simple à utiliser :

require 'breakpoint'

# du code...

breakpoint

# du code...

lancez votre script avec ruby. Dès que l'interpréteur rencontrera l'instruction breakpoint, il vous donnera la main via une session irb. Vous pourrez alors directement via l'interpréteur afficher le contenu des variables, faire des tests, injecter des données de test, utiliser la réflexion pour vérifier qu'un objet vérifie bien une propriété attendue, etc. Quittez la session irb et l'interpréteur reprendra là où il s'est arrêté.

Breakpoints intelligents

modifier

Plutôt que de faire appel à breakpoint dans votre code, utilisez assert. Passez-lui un bloc de code à évaluer et assert ne vous donnera la main que si le résultat est faux.

Ainsi, assert ne vous propose une session irb que s'il semble qu'il y ait besoin d'inspecter l'état du programme.

Corriger un code extérieur

modifier

Vous découvrirez parfois des problèmes dans du code dont vous dépendez (bibliothèques, gems diverses). Il peut s'agir de bogues ou de problèmes de sécurité ou de performances. Quoiqu'il en soit, ce problème vous ennui et vous devez le corriger.

Une première possibilité serait d'obtenir le code-source du code erroné, de le corriger et de construire l'application avec cette version. Cela pose évidemment des problèmes des mises à jour (il faudra fusionner vos corrections avec les modifications apportées par les nouvelles versions de la bibliothèque).

Ruby permet de résoudre ce problème simplement. Il vous suffit de redéfinir le code problématique. Supposons une classe problématique :

class Bibliotheque
  def une_methode()
    # du code erroné
  end
end

Il suffit de rouvrir la classe et de redéfinir la méthode. Au préalable, on crée un alias vers l'ancienne version pour des raisons de compatibilité.

class Bibliotheque

  alias :une_methode_BUG :une_methode

  def une_methode()
    # du code corrigé
  end
end

Cette méthode très efficace permet de contourner temporairement un problème. Bien sûr, proposez, dans la mesure du possible, votre correction aux auteurs de la bibliothèque concernée.