erlang io:format, и зависающее веб-приложение

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

- tim

8
задан Tim 26 March 2010 в 12:42
поделиться

3 ответа

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

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

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

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

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

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

Обычно мне удобно использовать:

erlang:display/1

для вывода переменных.

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

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

20
ответ дан 5 December 2019 в 07:34
поделиться

При разработке веб-приложений я использую модуль 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.

2
ответ дан 5 December 2019 в 07:34
поделиться

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

0
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: