2010-11-08 44 views
23

Corro Ubuntu 10.10. Voglio solo eseguire il debug di un semplice script. Dopo aver passato mezza giornata a cercare di capire come si potrebbe fare, mi arrendo. Che diamine dovrei fare?Come eseguire il debug del codice ruby?

Ho installato ruby-dev dal repository di Ubuntu
mi sono imbattuto sudo gem install ruby-debug e sudo gem install ruby-debug-ide

Ho provato un paio di modi diversi per fare questo lavoro. Ho provato require 'ruby-debug' e poi ho impostato debugger da qualche parte nel codice. Ma Ruby non troverà ruby-debug.
Ho provato a impostare vim-ruby-debugger, che impiegherà età per eseguire :Rdebugger myScript.rb e mi consentirà di impostare i punti di interruzione, ma non sembra essere un modo per eseguire il mio codice utilizzando quel debugger.
E ho provato a utilizzare NetBeans che si è bloccato in modo anomalo ogni volta che ho configurato il progetto e fatto clic su qualsiasi cosa.

Quindi, cara comunità: deve esserci un modo per eseguire il debug di Ruby. Non rotaie. Nulla di bello. Solo uno script CLI. Per favore aiutami o perdo ciò che rimane della mia sanità mentale.

Modifica: la gem exec dir non era nel mio percorso. Quindi, almeno rdebug sembra funzionare ora.

+0

Domanda correlata, sebbene più focalizzata sul debug di printf: http://stackoverflow.com/questions/3955688/how-do-i-bug-ruby-scripts –

risposta

19

Ruby-debug è per 1.8+ e ruby-debug19 è per 1.9+.

ruby-debug è facile da imparare e molto utile. È possibile dire all'applicazione di funzionare finché non si verifica una determinata condizione, quindi interromperla, facilitando l'individuazione di valori nulli o altre condizioni che si verificano sporadicamente.

Dalla riga di comando utilizzare rdebug appname e si finirà al prompt del debugger. Se si desidera eseguire la riga 100 e interrompere è possibile immettere c 100 e il debugger imposterà un punto di interruzione temporaneo, il programma verrà eseguito quindi si fermerà lì se si trova nel percorso di esecuzione. Una volta arrestato, il punto di interruzione temporaneo verrà cancellato. Se vuoi sempre fermarti alla linea 100, puoi fare b 100 quindi c e il debugger imposterà un punto di interruzione permanente, continua, quindi si ferma quando viene raggiunto il break-point. È possibile cancellare i punti di interruzione, impostare quelli condizionali che si verificano quando si applicano determinate condizioni, ecc. È possibile digitare n per passare all'istruzione successiva ignorando le chiamate di subroutine o s per passarvi sopra. Ci sono comandi per visualizzare il contenuto delle variabili in vari modi, quindi leggi i documenti.

Dall'interno di rdebug puoi inserire una shell IRB con le tue variabili già popolate in modo da poter attirare l'attenzione sulle cose per vedere cosa succede. Dall'interno è possibile controllare o impostare valori, aiutando con le regolazioni what-if. Se lo fai da dentro rdebug puoi continuare il programma con i valori modificati e vedere come si comporta.

IRB ha il suo posto, ed è grande per provare cose, ma non è un sostituto per il debugger, proprio come il debugger può fare alcune cose IRB-ish, ma non lo sostituirà. Entrambi gli strumenti sono una buona combinazione e non contano sulla base di dichiarazioni di stampa o di dumping su un file di registro.


Pry è emerso come una grande combinazione di IRB e un debugger, e vale la pena indagare.

+0

Essendo abituato ad usare debugger grafici, ruby-debug è stato un po 'scomodo da usare all'inizio, ma alla fine si è rivelato abbastanza pratico e sicuramente ha trovato il mio bug. Grazie per il consiglio! – bastibe

+3

I debugger grafici sono carini, ma la funzionalità che forniscono deve esistere a un livello inferiore, sotto la grafica altrimenti non avranno nulla da presentare. Trascorro così tanto tempo alla riga di comando che mi dimentico dei bei layout degli IDE. Tuttavia, mi affido al debugger della riga di comando per mostrarmi cosa si nasconde realmente in una variabile; Ho le mie opinioni su ciò che dovrebbe essere, ma a volte l'interprete non è d'accordo con me - e vince sempre finché non lo dico diversamente. :-) –

+0

si prega di checkout [pry-byebug] (https://github.com/deivid-rodriguez/pry-byebug), sembra essere la norma ora. – Hassek

4

Il debugger migliore che abbia mai usato per Ruby è quello incorporato in Netbeans. Devi installare la gem di debugger ruby ​​veloce da Netbeans (non sono sicuro di quale gem sia, ma Netbeans ti chiede di farlo). Trovo che funzioni molto meglio se si passa Netbeans dal JRuby 1.4 integrato all'installazione Ruby predefinita del sistema. C'è anche la gemma breakpoint che vale la pena dare un'occhiata, e usare la libreria integrata Ruby logger dall'inizio del tuo sviluppo è anche utile. In bocca al lupo!

+1

Netbeans si è semplicemente arrestato in modo anomalo ogni volta che volevo eseguirlo. Se il mio debugging ha bisogno di superare quello che Ruby-Debug ha da offrire, certamente lo verificherò. – bastibe

2

Utilizzare IRB. È una shell Ruby interattiva. Quando si verificano errori, dà una traccia con i numeri di riga in modo da poter dire quale parte del codice è andata storta. Puoi load i tuoi file sorgente ed eseguire i singoli metodi per vedere se funzionano correttamente. IRB fornisce un output utile: quando inserisci del codice, valuta l'espressione e quindi stampa il valore restituito usando .inspect.

+0

La leva è più efficiente di IRB. Permette molto più flessibile e la sua comunità sta crescendo (e si sovrappone alla comunità di IRB). – jackyalcine

12

pry è migliore rispetto a IRB. I seguenti sono afferrare dal suo README.

Pry è una potente alternativa alla shell IRB standard per Ruby. È scritto da zero per fornire una serie di funzioni avanzate, tra cui:

  • navigazione Codice sorgente (tra cui sorgente C core con la gemma leva-doc)
  • Documentazione navigazione
  • sistema Live help
  • metodi Open in redattori (edit-metodo Class # metodo)
  • evidenziazione della sintassi
  • integrazione della shell dei comandi (Start editori, git correre, e rastrello dall'interno Pr y)
  • integrazione Gist
  • navigazione intorno Stato (cd, ls e amici)
  • Runtime invocazione (usare leva come console sviluppatore o debugger)
  • supporto oggetto esotico (casi BasicObject, IClasses, ...)
  • Un potente e flessibile sistema di comando
  • Possibilità di visualizzare e alla storia di replay

  • Molti comandi di convenienza ispirati a IPython, Smalltalk e OTH er REPL avanzati

  • Un numero ampio di plug-in che forniscono sessioni remote, funzionalità di debug completo e altro.

Pry vuole essere anche più di una sostituzione IRB; è un tentativo di portare la programmazione guidata da REPL al linguaggio Ruby. Al momento non è così potente come strumenti come SLIME per i lisp, ma questa è la direzione generale che sta prendendo Pry.

La leva è anche abbastanza flessibile e consente una notevole personalizzazione dell'utente è banale impostarla per leggere da qualsiasi oggetto che abbia un metodo readline e scrivere su qualsiasi oggetto che abbia un metodo puts - molti altri aspetti di Pry sono anche configurabili rendendolo una buona scelta per l'implementazione di shell personalizzate.

+0

Sono d'accordo, non mi stavo divertendo a installare Ruby-Debug per Ruby 1.9.3. La leva funziona fuori dalla scatola ed è molto facile da usare. – Nosh

+0

Mega-upvote qui. Molto simile a python pdb.set_trace() - Stavo cercando qualcosa di simile. Funziona fuori dalla scatola in 1.9.3 come affermato da Nosh. – Koobz

+0

"la leva è migliore rispetto a IRB": questo era vero fino a [Pry.debugger] (https://github.com/nixme/pry-debugger) apparso a metà del 2012. –

7
  1. In Ruby:

    rubino -rdebug myscript.rb poi,

    • b: mettere break-point
    • e n (ext) o s (tep) e c (ontinue)
    • p (uts) per display
  2. in Rails: Avviare il server con

    • script/server di --debugger

      e aggiungere debugger nel codice.

1

si può vedere il Cheat Sheet esecuzione

gem install cheat 
    cheat rdebug 

Questo mostrerà comandi utili da utilizzare rdebug.

1

Prova di default di Ruby Debugger mediante:

ruby -r debug filename[, ...] 

O se è lo script CLI, basta cambiare la prima linea da:

#!/usr/bin/env ruby 

a:

#!/usr/bin/env ruby -rdebug 

e lo script si fermerà su ogni eccezione.

o controllare il seguente script di esempio:

#!/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 

È possibile eseguire il debug come illustrato di seguito:

# 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! 

Fonte: Ruby Debugger


alternativa utilizzare lldb/gdb. Vedi sotto l'esempio semplice per stampare lo script backtrace in primo piano:

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby) 

Sostituire lldb con gdb se funziona meglio. Prefisso con sudo per eseguire il debug di processo non di proprietà.

+0

Che concetto. Utilizzo del debugger integrato. Chi l'avrebbe mai detto. Ad ogni modo, ha funzionato per me. Ruby-debug è stato inserito nel comando ruby ​​come questo debugger predefinito o è qualcosa di diverso? – labyrinth

+0

Non ho idea, non sono nemmeno uno sviluppatore Ruby, ma a un certo punto ho dovuto eseguire il debug di un codice a me sconosciuto. – kenorb

0

Il debug di Ruby ha una storia difficile, piena di strumenti che supportano solo una versione secondaria specifica della risonanza magnetica. Per fortuna, per 2.0 e successivi, è possibile utilizzare byebug.

L'utilizzo della riga di comando è semplice: eseguire byebug <your script>.È inoltre possibile modificare il file e rilasciare la chiamata della funzione byebug in qualsiasi punto in cui si desidera eseguire il debug.

Problemi correlati