2010-03-26 4 views
5

Pendant que j'apprends une nouvelle langue, je vais généralement mettre beaucoup de stupide println pour voir quelles valeurs sont là à des moments précis. Cela suffit généralement car les langues ont généralement un équivalent tostring. En essayant cette même approche avec erlang, ma webapp "se bloque" quand il y a une valeur à imprimer qui n'est pas une liste. Cela se produit lorsque la variable en cours d'impression est un tuple au lieu d'une liste. Il n'y a pas d'erreur, d'exception, rien ... ne répond pas. Maintenant, je m'embrouille en faisant attention à ce que j'écris et en apprenant plus, les choses s'améliorent. Mais je me demande, y a-t-il un moyen d'imprimer de manière plus fiable une valeur sur stdout?
Merci,erlang io: format, et une application Web suspendue

--tim

+5

Du code s'il vous plaît? –

+0

N'oubliez pas que les variables Erlang étant des symboles statiques, vous n'avez pas besoin de les vérifier. C'est pourquoi Roberto Aloi dit que le traçage est plus efficace. Essayez d'écrire du code pour que la base de données choquante retourne au milieu d'une fonction et ne vous trébuche pas aussi; séparer les tâches de collecte de données et les tâches de traitement des données de sorte que la sortie de la collection soit l'entrée complète du traitement et que vous puissiez toujours savoir ce qui se passe, même avec des entrées folles de la base de données. – zxq9

Répondre

16

En Erlang, comme dans d'autres langues, vous pouvez imprimer vos variables, peu importe si elles sont une liste, un tuple ou quoi que ce soit d'autre.

Mon sentiment est que, pour l'impression, vous faites quelque chose comme (juste une supposition):

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

Ceci est faux, parce que vous êtes censé passer une liste d'arguments:

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

Où A peut être n'importe quoi.

Je trouve généralement confortable à utiliser:

erlang:display/1 

pour imprimer des variables. En outre, les fonctions de suivi sont généralement un meilleur moyen de déboguer une application, plutôt que d'utiliser des impressions. S'il vous plaît voir:

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

2

Lors du développement de webapps-je utiliser la error_logger module je définis habituellement quelques macros comme ce

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

Vous appelez les macros avec quelque chose comme:

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

Au cours de développement vous compilez vos modules avec:

erlc -Ddebug *.erl 

et ainsi vous obtenez des messages d'information dans votre console erlang.

0

Assurez-vous également qu'il n'y a pas de processus de terminaison sans lien, ce qui pourrait alors causer l'attente d'un autre processus et non le timeout, d'où une étrange partie suspendue.