2010-03-26 12 views
5

Mentre sto imparando una nuova lingua, in genere metto un sacco di stupide println per vedere quali sono i valori in momenti specifici. Di solito è sufficiente perché le lingue hanno in genere un equivalente tarseggiante. Nel provare lo stesso approccio con erlang, la mia webapp "si blocca" solo quando c'è un valore tentato di essere stampato che non è una lista. Questo accade quando la variabile stampata è una tupla anziché una lista. Non c'è nessun errore, eccezione, niente ... semplicemente non risponde. Ora, mi sto confondendo facendo attenzione a quello che sto scrivendo e mentre imparo di più, le cose stanno migliorando. Ma mi chiedo, c'è un modo per rendere più affidabile stampare [ciecamente] un valore per lo stdout?
Grazie,erlang io: format e un'applicazione web sospesa

--tim

+5

Qualche codice per favore? –

+0

Ricorda anche che poiché le variabili di Erlang sono simboli statici, non è necessario controllarle. Questo è il motivo per cui Roberto Aloi dice che tracciare è più efficace. Provare a scrivere il codice in modo che il database scioccante ritorni nel mezzo di una funzione, non farti inciampare; separare le attività di raccolta dei dati e le attività di elaborazione dei dati in modo che l'output della raccolta sia l'input completo per l'elaborazione e si può sempre sapere cosa sta succedendo, anche con gli input pazzi del db. – zxq9

risposta

16

in Erlang, come in altre lingue, è possibile stampare le variabili, non importa se sono un elenco, una tupla o qualsiasi altra cosa.

mia sensazione è che, per la stampa, si sta facendo qualcosa di simile (solo una supposizione):

io:format("The value is: ~p.", A). 

Questo è sbagliato, perché si suppone di passare un elenco di argomenti:

io:format("The value is: ~p.", [A]). 

Dove A può essere qualsiasi cosa.

solito trovo comodo da usare:

erlang:display/1 

per stampare le variabili.

Inoltre, le funzioni di tracciamento rappresentano in genere un modo migliore di eseguire il debug di un'applicazione, anziché utilizzare le stampe. Si prega di vedere:

http://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

2

Quando si sviluppa webapps Io uso il error_logger module Io di solito definisco alcune macro come questo

-ifdef(debug). 
-define(idbg(FmtStr, Err), 
     error_logger:info_msg("~p (line ~p): " FmtStr "~n", 
           [?MODULE, ?LINE | Err])). 
-define(rdbg(Term), error_logger:info_report(Term)). 
-else. 
-define(idbg(_FmtStr, _Err), void). 
-define(rdbg(_Term), void). 
-endif. 

si chiama la macro con qualcosa di simile:

code... 
?rdbg(ErlangTerm), 
other code... 

Durante sviluppo compilate i moduli con:

erlc -Ddebug *.erl 

e così si ottengono messaggi di informazione nella console di erlang.

0

Assicurarsi inoltre che non vi sia un processo di terminazione senza collegamento che potrebbe quindi far attendere ad altri processi qualcosa e non un timeouting, quindi una parte sospesa strana.