Programmation Ruby/Debuggueur
Le mode DEBUG
modifierUne 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
Utiliser le débogueur
modifierLe 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
modifierPlutô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
modifierVous 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.