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,[]) -&gt; 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,<<>>的主要内容,如果未能解决你的问题,请参考以下文章

<erl></erl> 中的 Yaws 代码未运行

YAWS Websocket 故障

概率dp——BAPC2019 L

死亡笔记中的L怎么写 哥特字体

Qt报错:qt.qpa.xcb: QXcbConnection: XCB error: 8 (BadMatch).....

Yaws 文件未正确渲染