Tracing in Ruby

29 aprile 2008

Per venire a capo di situazioni intricate è spesso utile tracciare l’esecuzione del programma per individuare il punto esatto dove il comportamento effettivo si discosta da quello atteso. Ruby offre diversi strumenti per ricavare informazioni utili sull’esecuzione del programma. Iniziamo col vedere alcuni semplici strumenti che permettono di tracciare il programma permettendo di capire quale riga di codice si sta eseguendo.

Tracing

Per individuare semplicemente il nome del file e il numero della linea di codice basta usare le keyword __FILE__ e __LINE__ che forniscono il nome del file e la posizione. Un utile impiego di queste keyword è nell’output di messaggi di debug, ad esempio se volessimo aggiungere alle nostre applicazioni un livello di debug possiamo fornire in output anche il nome del file e la riga:

if $DEBUG
  puts "[DEBUG] Some useful messages at Line #{__LINE__} in #{__FILE__}"
end

Uno strumento molto più potente è fornito attraverso la costante SCRIPT_LINES__ che se opportunamente inizializzata conterrà tutte le righe dei file inclusi nel programma. Per includere i file caricati con require e load basta inizializzare la costante SCRIPT_LINES__ come un hash:

SCRIPT_LINES__ = {}

Dopodiché ogni file caricato andrà a popolare l’hash. Ad esempio un semplice

require 'open-uri'

causerà l’inserimento nell’hash di tutti i file di cui viene fatto il parsing che saranno anche le chiavi di SCRIPT_LINES__:

>> puts SCRIPT_LINES__.keys
/usr/lib/ruby/1.8/parsedate.rb
/usr/lib/ruby/1.8/uri/http.rb
/usr/lib/ruby/1.8/uri/mailto.rb
/usr/lib/ruby/1.8/uri/ldap.rb
/usr/lib/ruby/1.8/uri/https.rb
/usr/lib/ruby/1.8/open-uri.rb
/usr/lib/ruby/1.8/rational.rb
/usr/lib/ruby/1.8/date/format.rb
/usr/lib/ruby/1.8/uri/common.rb
/usr/lib/ruby/1.8/uri.rb
/usr/lib/ruby/1.8/uri/ftp.rb
/usr/lib/ruby/1.8/uri/generic.rb
/usr/lib/ruby/1.8/time.rb

I valori dell’hash saranno degli array di stringhe contenenti il codice sorgente di ogni file. Se si vuole invece includere anche il file sorgente occorre inserirlo riga per riga nell’hash, ad esempio inizializzandolo in questo modo:

SCRIPT_LINES__ = {__FILE__ => File.readlines(__FILE__)}

Per accedere poi alla linea voluta basta accedere al valore desiderato dell’hash indicando il nome del file e la riga. Ad esempio

SCRIPT_LINES__['/usr/lib/ruby/1.8/uri.rb'][1]

produrrà in output la seconda linea del file uri.rb.

Questa costante viene utilizzata principalmente nella costruzione di strumenti di debugging e di coverage ma in alcuni casi è utile anche nelle normali applicazioni.

Se vuoi aggiornamenti su Tracing in Ruby inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Tracing in Ruby

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy