2

在使用 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]

任何想法这告诉我什么?

此外,非常欢迎对适合初学者的调试器提出任何建议。

4

2 回答 2

4

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

  1. 在交互模式下运行 yaws:yaws -i
  2. 一旦 yaws 出现,按回车键获得 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).

现在跟踪yaws_server:skip_data/2获取空二进制文件作为第一个参数的条件,当它出现时,获取回溯:

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

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

于 2013-11-28T17:10:02.820 回答
0

如果我是正确的,out 函数的输出应该是一个列表。我没有检查您的整个代码,但以下应该可以工作:

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

</erl>
于 2013-11-27T13:03:26.663 回答