【问题标题】:erlang io:format, and a hanging web applicationerlang io:format 和一个挂起的 Web 应用程序
【发布时间】:2010-03-27 07:53:19
【问题描述】:

当我学习一门新语言时,我通常会放很多愚蠢的 println 来查看特定时间的值在哪里。它通常就足够了,因为这些语言通常具有可用的 tostring 等价物。在使用 erlang 尝试相同的方法时,当尝试打印一个不是列表的值时,我的 webapp 只是“挂起”。当正在打印的变量是一个元组而不是一个列表时,就会发生这种情况。没有错误,异常,什么都没有……只是没有响应。现在,我对自己写的东西很小心,随着我了解的更多,事情正在变得更好。但我想知道,有没有办法更可靠地 [盲目地] 将值打印到标准输出?
谢谢,

--提姆

【问题讨论】:

  • 还要记住,由于 Erlang 变量是静态符号,所以您不需要检查它们。这就是为什么 Roberto Aloi 说追踪更有效。尝试编写代码,以便在函数中间返回令人震惊的数据库也不会绊倒你;将数据收集任务和数据处理任务分开,以便收集的输出是处理的完整输入,即使来自数据库的疯狂输入,您也可以随时知道发生了什么。

标签: erlang


【解决方案1】:

在 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/

【讨论】:

    【解决方案2】:

    在开发 webapps 时,我使用 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 控制台中收到信息消息。

    【讨论】:

      【解决方案3】:

      还要确保没有没有链接的终止进程,这可能会导致其他进程等待某些东西而不是超时 - 因此是奇怪的挂起部分。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 2011-03-29
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        相关资源
        最近更新 更多