Yaws 进程死亡:badmatch,<<>>
Posted
技术标签:
【中文标题】Yaws 进程死亡:badmatch,<<>>【英文标题】:Yaws process died: badmatch,<<>>Yaws 进程死亡:badmatch,<<>> 【发布时间】:2013-12-12 14:08:03 【问题描述】:在使用 yaws 时,我正在阅读一本非常基本的 erlang 书籍。我正在编辑一个 yaws 文件并刷新浏览器。通常(现在第三次)该过程将开始显示此错误。我寻找并寻找语法错误或任何东西,最终我只是重新启动该过程并且一切正常。无需对源文件进行任何更改。
现在这是上次触发错误的源文件
<erl>
out(Arg) ->
ehtml,
table, [width, "100%"],
tr,[],
[td, [width, "50%"], "hello world!",
td, [width, "50%"], "hi again."]
.
</erl>
我尝试搜索错误,但是所有搜索结果都有一个有意义的上下文,比如“无访问权”,我得到的只是“>”
=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]]
一些版本信息:
偏航 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]你知道这告诉我什么吗?
此外,非常欢迎对适合初学者的调试器提出任何建议。
【问题讨论】:
在来自 github 的 yaws master 上,这只是 1.98 版之后的几次提交,我无法重现此问题。您可以尝试更新到version 1.98 from here 看看是否仍然遇到同样的问题吗? 就调试器而言,有 Erlang debugger,但 IMO 值得学习 Erlang tracing,因为它比调试器更强大、更容易。在使用 Erlang 超过 7 年的时间里,我只使用过两次调试器,但一直使用跟踪。 我也刚刚尝试通过围攻 Yaws 1.94 和 R15B01 来攻击您的 .yaws 文件的副本,但仍然无法重现它。 【参考方案1】:对于调试,我认为使用 Erlang 跟踪会有所帮助。我们想弄清楚为什么yaws_server:skip_data/2
函数会得到badmatch
异常,特别是为什么它会得到一个空的二进制文件,因为这是它遇到该错误的唯一方法。所以我们需要追踪那个条件。试试这些步骤(不要忘记每个 Erlang shell 命令的结尾句点):
-
在交互模式下运行偏航:
yaws -i
出现 yaws 后,按 Enter 以获取 Erlang shell 提示符。
为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 并在此处发布后续链接。
【讨论】:
谢谢!一旦发生就会尝试。我注意到只有在我大量更改文件时才会发生这种情况。【参考方案2】:如果我是正确的,out 函数的输出应该是一个列表。我没有检查你的整个代码,但以下应该可以工作:
<erl>
out(Arg) ->
[ehtml,
table, [width, "100%"],
tr,[],
[td, [width, "50%"], "hello world!",
td, [width, "50%"], "hi again."]
].
</erl>
【讨论】:
它是可选的。您可以返回一个元组(本书中所有早期示例都只是一个元组)或一个列表,如果您想说,将标题与 html 输出一起发送。请记住,我提到只需重新启动服务器就足以摆脱失败的情况。无需更改代码。 哎呀,我没有仔细阅读你的问题......还不错,我学到了一些东西。以上是关于Yaws 进程死亡:badmatch,<<>>的主要内容,如果未能解决你的问题,请参考以下文章
Qt报错:qt.qpa.xcb: QXcbConnection: XCB error: 8 (BadMatch).....