【问题标题】:Erlang VM -s argument misbehavingErlang VM -s 参数行为不端
【发布时间】:2011-01-06 00:19:48
【问题描述】:

当我在 erl shell 中启动一个函数时,它工作正常。当我尝试使用 erl ... -s 模块函数调用相同的函数时,它失败了。

最终失败的代码行是:

start(Port) ->
    mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).

我确信端口设置正确。我的错误信息是:

=CRASH REPORT==== 17-Jan-2010::00:21:09 ===
  crasher:
    initial call: mochiweb_socket_server:acceptor_loop/1
    pid: <0.65.0>
    registered_name: []
    exception exit: {error,closed}
      in function  mochiweb_socket_server:acceptor_loop/1
    ancestors: [mochiweb_http,<0.1.0>]
    messages: []
    links: []
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 377
    stack_size: 24
    reductions: 93
  neighbours:

我尝试了调试器,它让我可以单步执行,直到给出上面的代码行。在我通过之后,它会给我这个崩溃报告。

非常感谢任何帮助。

【问题讨论】:

  • 你能粘贴一个最小的代码来重现这个错误吗?
  • 我意识到我粘贴的内容无法编译。这甚至对我不起作用:pastie.org/782752 你在什么系统上运行?我在 OS X 上使用 Erlang R13B02。

标签: erlang erl


【解决方案1】:

嗯,我认为应该可以。 所有模块都使用相同的编译器版本编译吗?如果没有,IIRC 在套接字级别可能会出现奇怪的错误。 顺便说一句,你可以调用你的入口点函数 start 这是 -s 的默认值。

【讨论】:

  • andi5:如何检查每个版本的编译器版本?
  • proplists:get_value(version, Mod:module_info(compile))。应该为模块 Mod 显示它。使用 lists:foreach/2 和 code:all_loaded() 您可以遍历所有已加载模块的列表。
  • 一切似乎都未定义或 4.6.3。查看pastie.org/782757。此外,这也失败了,它使用 start 作为入口点:pastie.org/782752
  • 没有关于 mochiweb_http 的内容。您确定在检查编译器版本之前尝试启动服务器吗?
  • 啊,是的,这会有所帮助。加载后我重新运行它,它仍然是 4.6.3 或未定义。
【解决方案2】:

您也可以尝试-eval 选项:

erl -eval 'module:start(9090).'

【讨论】:

    【解决方案3】:

    当使用 -s 时,参数被收集到一个列表中,因此端口实际上会包含在一个列表中。您可以使用包装函数(如start([Port]))检查这两种情况(列表或整数)。

    【讨论】:

    • 我实际上有一个包装器。我实际上是在调用 start_all/0 来调用 start。我的命令是:erl -boot start_sasl -s server_util start_all
    【解决方案4】:

    当你使用 -s 运行 Erlang 函数时,参数被放入 atoms 列表中。当你使用 -run 运行 Erlang 函数时,参数被放入 strings 列表中。

    如果您需要传递一个 整数 值,则需要进行适当的转换。如果您想涵盖所有情况,这样的事情可能会有所帮助:

    start([Port]) when is_atom(Port) ->
        start([atom_to_list(Port)]);
    start([Port]) when is_list(Port) ->
        start(list_to_integer(Port));
    start(Port) when is_integer(Port) ->
        mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).
    

    有关详细信息,请参阅 erl ("erl -man erl") 的手册页。

    【讨论】:

    • 感谢您提供详细信息。但是,我应该编辑我的问题,因为我实际上正在调用 start/0,它使用我的默认端口调用 start/1。我开始删除东西并最终将我的问题简化为:pastie.org/782752——这对你有用吗?它在 OS X 上对我来说失败了。有什么想法吗?非常感谢。
    • 嗯,“循环”的乐趣不是循环。我不熟悉 mochiweb,所以我不能告诉你这是你的问题。无论如何,该粘贴对我来说似乎是一个完全独立的问题,就像正确的 mochiweb API 使用之一,而不是“erl -s”启动。可能最好用那个新问题打开一个新问题。
    • ndim:但是当我从 erl 控制台中调用它时它工作正常。此外,将其修复为真正的循环也无济于事:pastie.org/788592。问题是 gen_tcp:listen 由于某种原因返回 {error, closed}。
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2017-01-23
    • 2013-05-25
    • 2019-06-05
    • 2017-10-31
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多