在使用雅司病时,我正在阅读一本非常基本的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}]}]}
某些版本信息:
这是什么想法告诉我的?
此外,非常欢迎任何对初学者有用的调试器建议。
答案 0 :(得分:4)
对于调试,我认为使用Erlang跟踪会很有帮助。我们想弄清楚为什么yaws_server:skip_data/2
函数会获得badmatch
异常,特别是为什么它会传递一个空二进制文件,因为这是它遇到该错误的唯一方法。所以我们需要追踪那个条件。尝试这些步骤(并且不要忘记每个Erlang shell命令的尾随时间段):
yaws -i
dbg
创建跟踪功能,以便我们从跟踪数据中获得格式合理的回溯:F = fun({trace,_,_,_,Dump},[]) -> io:format("~s~n", [binary_to_list(Dump)]), [] end.
dbg:tracer(process, {F, []}).
dbg:p(all, call).
现在跟踪yaws_server:skip_data/2
获取空二进制文件作为第一个参数的条件,当它出现时,得到一个回溯:
dbg:tpl(yaws_server,skip_data,dbg:fun2ms(fun([<<>>, _]) -> message(process_dump()) end)).
有了这个,开始点击你的.yaws
页面,直到你引发条件,此时你的Erlang shell中会显示一个回溯。如果您获得该回溯,请将其复制到gist或pastebin并在此处发布一个链接作为后续跟踪。
答案 1 :(得分:0)
如果我是正确的,out函数的输出应该是一个列表。我没有检查你的整个代码,但以下内容应该有效:
<erl>
out(Arg) ->
[{ehtml,
{table, [{width, "100%"}],
{tr,[],
[{td, [{width, "50%"}], "hello world!"},
{td, [{width, "50%"}], "hi again."}]
}
}
}].
</erl>