2010-03-26 25 views
5

Mientras estoy aprendiendo un nuevo idioma, generalmente pondré muchas tonterías para ver qué valores hay en momentos específicos. Por lo general, es suficiente porque los idiomas suelen tener disponible un equivalente tostring. Al intentar el mismo enfoque con erlang, mi aplicación web simplemente "se cuelga" cuando se intenta imprimir un valor que no es una lista. Esto sucede cuando la variable que se imprime es una tupla en lugar de una lista. No hay error, excepción, nada ... simplemente no responde. Ahora, estoy teniendo problemas al tener cuidado con lo que estoy escribiendo y a medida que aprendo más, las cosas están mejorando. Pero me pregunto, ¿hay alguna manera de imprimir un valor a stdout de forma más confiable?
Gracias,erlang io: format, y una aplicación web colgante

--Tim

+5

¿Algún código, por favor? –

+0

Tenga en cuenta también que, dado que las variables de Erlang son símbolos estáticos, no es necesario que las controle. Esta es la razón por la cual Roberto Aloi dice que el rastreo es más efectivo. Intenta escribir código para que la impactante base de datos regrese en el medio de una función y no te haga tropezar; Separe las tareas de recopilación de datos y las tareas de procesamiento de datos para que la salida de la recopilación sea la entrada completa al procesamiento y siempre se puede saber lo que está sucediendo, incluso con entradas locas de la base de datos. – zxq9

Respuesta

16

En Erlang, como en otros idiomas, puede imprimir sus variables, independientemente de si son una lista, una tupla o cualquier otra cosa.

Mi sensación es que, para la impresión, que está haciendo algo así como (sólo una suposición):

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

Esto es incorrecto, ya que se supone que debes pasar una lista de argumentos:

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

Donde A puede ser cualquier cosa.

por lo general encuentran cómodos de usar:

erlang:display/1 

para imprimir variables.

Además, las funciones de seguimiento suelen ser una mejor forma de depurar una aplicación, en lugar de utilizar las impresiones. Por favor ver:

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

2

En el desarrollo de aplicaciones web que utilizan el error_logger module que suelen definir algunas macros como esto

-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. 

Se llama a las macros con algo como:

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

Durante desarrollo con el que compila sus módulos con:

erlc -Ddebug *.erl 

y así obtendrá mensajes de información en su consola Erlang.

0

También asegúrese de que no haya proceso de terminación sin enlace, lo que podría causar que otro proceso espere algo y no agote el tiempo de espera, por lo tanto, extrañe la pieza colgante.