虽然我正在学习一门新语言,但我通常会选择大量愚蠢的println来查看特定时间的值。它通常就足够了,因为语言通常具有等效的tostring。在使用erlang尝试相同的方法时,当尝试打印的值不是列表时,我的webapp就会“挂起”。当打印的变量是元组而不是列表时,会发生这种情况。没有错误,例外,没有......只是没有回应。现在,我正在通过小心我正在写的内容而糊涂,随着我学到更多,事情变得越来越好。但我想知道,有没有办法更可靠地[盲目]将值打印到标准输出? 谢谢,
- 添
答案 0 :(得分:20)
在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/
答案 1 :(得分:2)
在开发网络应用时,我使用error_logger module 我通常会定义一些这样的宏
-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 :(得分:0)
同时确保没有没有链接的终止进程,这可能导致其他进程等待某些事情而不是超时 - 因此奇怪的悬挂部分。