雅司病程死了:{{badmatch,<<>>}

时间:2013-11-27 04:26:10

标签: debugging erlang yaws erl

在使用雅司病时,我正在阅读一本非常基本的erlang书。我正在编辑一个yaws文件并刷新浏览器。通常(现在第3次)该过程将开始显示此错误。我看,并寻找语法错误或任何东西,最终我只是重新启动过程,一切正常。没有对源文件进行任何更改。

现在这是最后一次触发错误的源文件

<erl>
out(Arg) ->
        {ehtml,
                {table, [{width, "100%"}],
                        {tr,[],
                                [{td, [{width, "50%"}], "hello world!"},
                                {td, [{width, "50%"}], "hi again."}]
                        }
                }
        }.

</erl>

我尝试搜索错误,但所有搜索结果都有一个有意义的上下文,例如“无法访问”,我得到的是“&lt;&lt;&gt;&gt;”

=ERROR REPORT==== 26-Nov-2013::20:17:32 ===
Yaws process died: {{badmatch,<<>>},
                    [{yaws_server,skip_data,2,
                                  [{file,"yaws_server.erl"},{line,2951}]},
                     {yaws_server,deliver_dyn_file,6,
                                  [{file,"yaws_server.erl"},{line,2717}]},
                     {yaws_server,aloop,4,
                                  [{file,"yaws_server.erl"},{line,1152}]},
                     {yaws_server,acceptor0,2,
                                  [{file,"yaws_server.erl"},{line,1013}]},
                     {proc_lib,init_p_do_apply,3,
                               [{file,"proc_lib.erl"},{line,227}]}]}

某些版本信息:

  • Yaws 1.94
  • Debian GNU / Linux 7.2(wheezy)
  • Linux 3.2.0-4-amd64#1 SMP Debian 3.2.51-1 x86_64 GNU / Linux
  • Erlang R15B01(erts-5.9.1)[source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

这是什么想法告诉我的?

此外,非常欢迎任何对初学者有用的调试器建议。

2 个答案:

答案 0 :(得分:4)

对于调试,我认为使用Erlang跟踪会很有帮助。我们想弄清楚为什么yaws_server:skip_data/2函数会获得badmatch异常,特别是为什么它会传递一个空二进制文件,因为这是它遇到该错误的唯一方法。所以我们需要追踪那个条件。尝试这些步骤(并且不要忘记每个Erlang shell命令的尾随时间段):

  1. 以交互模式运行雅司:yaws -i
  2. 一旦出现雅司病,请按Enter键以获取Erlang shell提示符。
  3. dbg创建跟踪功能,以便我们从跟踪数据中获得格式合理的回溯:F = fun({trace,_,_,_,Dump},[]) -> io:format("~s~n", [binary_to_list(Dump)]), [] end.
  4. 使用此命令打开跟踪:dbg:tracer(process, {F, []}).
  5. 在所有流程中跟踪调用:dbg:p(all, call).
  6. 现在跟踪yaws_server:skip_data/2获取空二进制文件作为第一个参数的条件,当它出现时,得到一个回溯:

    dbg:tpl(yaws_server,skip_data,dbg:fun2ms(fun([<<>>, _]) -> message(process_dump()) end)).
    

    有了这个,开始点击你的.yaws页面,直到你引发条件,此时你的Erlang shell中会显示一个回溯。如果您获得该回溯,请将其复制到gistpastebin并在此处发布一个链接作为后续跟踪。

答案 1 :(得分:0)

如果我是正确的,out函数的输出应该是一个列表。我没有检查你的整个代码,但以下内容应该有效:

<erl>
out(Arg) ->
        [{ehtml,
                {table, [{width, "100%"}],
                        {tr,[],
                                [{td, [{width, "50%"}], "hello world!"},
                                {td, [{width, "50%"}], "hi again."}]
                        }
                }
        }].

</erl>