【问题标题】:How to figure out what caused a runtime error in Erlang?如何找出导致 Erlang 运行时错误的原因?
【发布时间】:2016-11-20 03:43:56
【问题描述】:

我刚开始使用 Erlang,所以我的代码还没有复杂的东西。我经常犯的错误会导致运行时错误。

问题是我总是看到这样的事情:

{"init 终止于 do_boot",{undef,[{'lexer_app.beam',start,[],[]},{init,start_it,1,[]},{init,start_em,1,[ ]}]}}

崩溃转储正在写入:erl_crash.dump...done init 终止于 do_boot()

这很难让我快速了解问题所在。

因此,我想知道,是调试此类错误以查看 erl_crash.dump 的唯一方法,坦率地说,这看起来像是完全的 abrakadabra,我需要通过调查以某种方式找出即使是简单的愚蠢错误?

主要问题,是否有可能得到更人性化的错误,例如“5:6 字符串类型的人员变量不可分配给类型编号”?

调试应用程序的通常工作流程是什么?

【问题讨论】:

  • 在这里您可以阅读消息的开头:VM 的 init 在 do_boot 中停止,因为它找到了对未定义函数的调用:'lexer_app.beam':start。我猜你已经用“erl -s lexer_app.beam”而不是“erl -s lexer_app”开始了erl,最终可以选择将路径添加到梁文件“erl -s lexer_app -pa path/to/beam”

标签: debugging erlang


【解决方案1】:

您不能简单地阅读故障转储文件的文本。相反,您应该使用crashdump viewer,这是一个图形应用程序,可让您以人性化的方式查看故障转储文件包含的所有详细信息。

【讨论】:

    【解决方案2】:

    如果你只想看到漂亮的错误信息,你可以做一个小技巧

    7> {_type, {Reason, Stack}} = {"init terminating in do_boot",{undef,[{'lexer_app.beam',start,[],[]},{init,start_it,1,[]},{init,start_em,1,[]}]}}.
    {"init terminating in do_boot",
     {undef,[{'lexer_app.beam',start,[],[]},
             {init,start_it,1,[]},
             {init,start_em,1,[]}]}}
    8> erlang:raise(exit, Reason, Stack).
    ** exception exit: undef                                         
         in function  'lexer_app.beam':start/0
            called as 'lexer_app.beam':start()
         in call from init:start_it/1 
         in call from init:start_em/1 
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多