erlang io: формат и зависшее веб-приложение - PullRequest
8 голосов
/ 26 марта 2010

Пока я изучаю новый язык, я обычно выкладываю много глупых распечаток, чтобы посмотреть, какие значения находятся в определенное время. Обычно этого достаточно, потому что языки обычно имеют эквивалент tostring. При попытке использовать тот же подход с erlang, мое веб-приложение просто «зависает», когда пытались напечатать значение, которое не является списком. Это происходит, когда печатаемая переменная является кортежем, а не списком. Там нет ошибок, исключений, ничего ... просто не отвечает. Теперь я стараюсь быть внимательным к тому, что пишу, и когда я узнаю больше, все становится лучше. Но мне интересно, есть ли способ более надежно [вслепую] напечатать значение для stdout?
Спасибо,

- тим

Ответы [ 3 ]

20 голосов
/ 26 марта 2010

В Erlang, как и в других языках, вы можете печатать свои переменные, независимо от того, являются ли они списком, кортежем или чем-то еще.

Мне кажется, что для печати вы делаете что-то вроде (просто предположение):

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

Это неправильно, потому что вы должны передать список аргументов:

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

Где А может быть чем угодно.

Мне обычно удобно пользоваться:

erlang:display/1

для печати переменных.

Кроме того, функции трассировки обычно являются лучшим способом отладки приложения, а не использования распечаток. Пожалуйста, смотрите:

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

2 голосов
/ 26 марта 2010

При разработке веб-приложений я использую модуль error_logger Я обычно определяю некоторые макросы как это

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

Вы вызываете макросы с чем-то вроде:

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

Во время разработки вы компилируете свои модули с:

erlc -Ddebug *.erl

и вы получаете информационные сообщения в консоли erlang.

0 голосов
/ 27 марта 2010

Также убедитесь, что не существует завершающего процесса без ссылки, который может затем заставить другой процесс ожидать чего-то, а не тайм-аут - отсюда странная зависание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...