Comment déboguer le code ruby?
Je lance Ubuntu 10.10. Je veux juste déboguer un script simple. Après avoir passé une demi-journée à essayer de comprendre comment cela pourrait être fait que j'abandonne. Que diable suis-je censé faire?
J'ai installé ruby-dev
à partir du référentiel Ubuntu
J'ai couru sudo gem install ruby-debug
et sudo gem install ruby-debug-ide
J'ai essayé différentes façons de faire ce travail. J'ai essayé require 'ruby-debug'
et ensuite définir debugger
quelque part dans le code. Mais Ruby ne trouvera pas ruby-debug
.
J'ai essayé de paramétrage de vim-ruby-debugger
, qui prendra âges pour exécuter :Rdebugger myScript.rb
et me permettra de définir des points d'arrêt, mais il ne semble pas y avoir de moyen d'exécuter mon code en utilisant ce débogueur.
Et j'ai essayé D'utiliser NetBeans qui s'est simplement écrasé chaque fois que j'ai mis en place le projet et cliqué sur n'importe quoi.
Donc, chère Communauté: il doit y avoir un moyen de déboguer Ruby. Pas De Rails. Rien de fantaisie. Juste quelques script CLI. Aidez-moi ou je perds ce qui reste de ma santé mentale.
Modifier: le dir gem exec n'était pas sur mon chemin. Donc, au moins rdebug semble fonctionner maintenant.
9 réponses
Ruby-debug est pour 1.8+ et ruby-debug19 est pour 1.9+.
Ruby-debug est facile à apprendre et très utile. Vous pouvez dire à l'application de s'exécuter jusqu'à ce qu'une certaine condition existe, puis la casser, ce qui facilite la localisation de valeurs nulles ou d'autres conditions qui se produisent sporadiquement.
À partir de la ligne de commande, Utilisez rdebug appname
et vous finirez à l'invite du débogueur. Si vous voulez exécuter à la ligne 100 et arrêter, vous pouvez entrer c 100
et le débogueur définira un point d'arrêt temporaire, le programme va alors s'arrêter là si c'est dans le chemin d'exécution. Une fois qu'il s'arrête, le point de rupture temporaire sera effacé. Si vous voulez toujours vous arrêter à la ligne 100, Vous pouvez faire b 100
puis c
et le débogueur définira un point de rupture permanent, Continuer, puis arrêter lorsque le point de rupture est atteint. Vous pouvez effacer les points d'arrêt, définir des points conditionnels qui se produisent lorsque certaines conditions s'appliquent, etc. Vous pouvez taper n
pour passer à l'instruction suivante en ignorant les appels de sous-programme, ou s
pour y entrer. Il existe des commandes pour afficher le contenu des variables de différentes manières, alors lisez les documents.
De l'intérieur de rdebug, vous pouvez déposer dans un shell IRB avec vos variables déjà remplies afin que vous puissiez fouiller les choses pour voir ce qui se passe. De l'intérieur, vous pouvez inspecter ou définir des valeurs, en aidant avec des ajustements de simulation. Si vous faites cela à partir de rdebug, vous pouvez continuer le programme avec la ou les valeurs modifiées et voir comment il se comporte.
IRB a sa place, et c'est génial pour essayer choses, mais ce n'est pas un substitut pour le débogueur, comme le débogueur peut faire des RIR-ish choses, mais ne la remplacera pas. Les deux outils sont une bonne combinaison et battent le diable hors de compter sur des déclarations d'impression ou de dumping dans un fichier journal.
Pry est apparu comme une excellente combinaison D'IRB et d'un débogueur , et mérite d'être étudié.
Soulever est mieux par rapport à la CISR. Ce qui suit sont grab de son README .
Pry est une alternative puissante au shell IRB standard pour Ruby. Il est écrit à partir de zéro pour fournir un certain nombre de fonctionnalités avancées, y compris:
- navigation dans le code Source (y compris la source core C avec la gemme pry-doc)
- navigation dans la Documentation
- Système D'aide en direct
- ouvrir les méthodes dans les éditeurs (edit-method Classe # méthode)
- coloration syntaxique
- intégration du shell de commande (démarrer les éditeurs, exécuter git et rake depuis Pry)
- intégration de L'essentiel
- Navigation autour de l'état (cd, ls et amis)
- appel à L'exécution (utiliser Pry comme console de développement ou débogueur)
- prise en charge des objets exotiques (instances BasicObject, IClasses,...)
- un système de commande puissant et flexible
-
Possibilité d'afficher et de rejouer histoire
-
De nombreuses commandes de commodité inspirées par IPython, Smalltalk et d'autres REPL avancées
Un grand nombre de plugins qui fournissent des sessions à distance, une fonctionnalité de débogage complète, et plus encore.
Pry vise également à être plus qu'un remplacement IRB; c'est une tentative d'apporter une programmation pilotée par REPL au langage Ruby. Il est actuellement pas aussi puissant que des outils comme SLIME pour lisp, mais c'est la Direction Générale Pry est rubrique.
Pry est également assez flexible et permet une personnalisation significative de l'utilisateur est trivial pour le mettre en lecture à partir de n'importe quel objet qui a une méthode readline et écrire à n'importe quel objet qui a une méthode puts-de nombreux autres aspects de Pry sont également configurables ce qui en fait un bon choix pour implémenter
-
Dans Ruby:
Ruby-rdebug myscript.RB alors,
- b: mettre le point de rupture
- et n(ext) ou s(tep) et c(continuer)
- p(uts) pour l'affichage
-
Dans Rails: lancez le serveur avec
-
Script / serveur --débogueur
Et ajoutez le débogueur dans le code.
-
Le meilleur débogueur que J'ai jamais utilisé pour Ruby est celui intégré à Netbeans . Vous devez installer la gemme de débogueur ruby rapide de Netbeans (Je ne suis pas sûr de quelle gemme il s'agit réellement, mais Netbeans vous invite à le faire). Je trouve que cela fonctionne beaucoup mieux si vous changez Netbeans de JRuby 1.4 intégré à L'installation Ruby par défaut de votre système. Il y a aussi la gemme breakpoint
qui vaut le coup d'oeil, et en utilisant la bibliothèque intégrée Ruby logger
dès le début de votre le développement est également utile. Bonne chance!
Utilisez IRB. C'est une coquille Ruby interactive. Lorsque des erreurs se produisent, il donne une trace avec des numéros de ligne afin que vous puissiez dire quelle partie de votre code a mal tourné. Vous pouvez load
vos fichiers source et exécuter des méthodes individuelles pour voir si elles fonctionnent correctement. IRB fournit une sortie utile-lorsque vous entrez du code, il évaluera l'expression, puis imprimera la valeur de retour en utilisant .inspect
.
Vous pouvez voir la feuille de triche en cours d'exécution
gem install cheat
cheat rdebug
Cela affichera des commandes utiles pour utiliser rdebug.
Essayez le débogueur Ruby par défaut soit par:
ruby -r debug filename[, ...]
Ou si c'est un script CLI, changez simplement sa première ligne de:
#!/usr/bin/env ruby
À:
#!/usr/bin/env ruby -rdebug
Et le script s'arrêtera à chaque Exception.
Ou vérifiez l'exemple de script suivant:
#!/usr/bin/env ruby
class Hello
def initialize( hello )
@hello = hello
end
def hello
@hello
end
end
salute = Hello.new( "Hello, Mac!" )
puts salute.hello
Vous pouvez le déboguer comme indiqué ci-dessous:
# ruby -r debug hello.rb
Debug.rb
Emacs support available.
hello.rb:3:class Hello
(rdb:1) v l
salute => nil
(rdb:1) b 10
Set breakpoint 1 at hello.rb:10
(rdb:1) c
Hello, Mac!
Source: Débogueur Ruby
Utilisez alternativement lldb
/gdb
. Voir ci-dessous l'exemple simple pour imprimer le script backtrace dans premier plan:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
remplacez lldb
par gdb
si cela fonctionne mieux. Préfixe avec sudo
pour déboguer un processus non possédé.
Le débogage Ruby a une histoire difficile, jonchée d'outils qui ne prennent en charge qu'une version mineure spécifique de L'IRM. Heureusement, pour 2.0 et au-delà, vous pouvez utiliser byebug .
L'utilisation de la ligne de commande est simple: exécutez byebug <your script>
. Vous pouvez également modifier votre fichier et déposer l'appel de fonction byebug
où vous voulez lancer le débogage.
Il y a beaucoup de débogueurs basés sur la console pour ruby avec des fonctionnalités différentes, sur la base desquelles vous ferez un choix.
Si vous avez besoin important-est une navigation intuitive (par exemple, se déplace suivant ligne par ligne, entrer dans des blocs), et une documentation compréhensible rapide-cela fonctionne pour moi le meilleur:
Https://github.com/garmoshka-mo/pry-moves
Autre fonctionnalité cool que j'avais la demande - est de déboguer de l'intérieur du débogueur. Comme si j'avais arrêté en Action du contrôleur:
def index
list = Orders.for_user(current_user)
=> binding.pry
end
Maintenant, je veux comprendre pourquoi list
est vide? - Je peux courir {[2] } et voir ce qui se passe là-bas