Debugging Yaws进程已终止:{{badmatch,<;<;>;}
在使用yaws时,我正在浏览一本非常基本的erlang手册。我正在编辑一个yaws文件并刷新浏览器。通常(现在是第三次)该过程会显示此错误。我会不断查找语法错误或其他任何错误,最终我只需重新启动该过程,一切正常。对源文件没有任何更改 现在这是上次触发错误的源文件Debugging Yaws进程已终止:{{badmatch,<;<;>;},debugging,erlang,yaws,erl,Debugging,Erlang,Yaws,Erl,在使用yaws时,我正在浏览一本非常基本的erlang手册。我正在编辑一个yaws文件并刷新浏览器。通常(现在是第三次)该过程会显示此错误。我会不断查找语法错误或其他任何错误,最终我只需重新启动该过程,一切正常。对源文件没有任何更改 现在这是上次触发错误的源文件 <erl> out(Arg) -> {ehtml, {table, [{width, "100%"}], {tr,[],
<erl>
out(Arg) ->
{ehtml,
{table, [{width, "100%"}],
{tr,[],
[{td, [{width, "50%"}], "hello world!"},
{td, [{width, "50%"}], "hi again."}]
}
}
}.
</erl>
输出(Arg)->
{ehtml,
{table,[{width,“100%”表格],
{tr,[],
[{td,[{width,“50%”,“}”,“你好,世界!”,
{td,[{width,“50%”,“}],“你好。”}]
}
}
}.
我尝试搜索错误,但如果所有搜索结果都有一个有意义的上下文,如“无访问权限”,则我得到的是“”
=错误报告===2013年11月26日::20:17:32===
Yaws进程已死亡:{{badmatch,},
[{yaws_服务器,跳过_数据,2,
[{file,“yaws_server.erl”},{line,2951}]},
{yaws_服务器,传递动态文件,6,
[{file,“yaws_server.erl”},{line,2717}]},
{yaws_server,aloop,4,
[{file,“yaws_server.erl”},{line,1152}]},
{yaws_服务器,接受器0,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(喘息)
- Linux 3.2.0-4-amd64#1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
- Erlang R15B01(erts-5.9.1)[源代码][64位][smp:4:4][异步线程:0][hipe][内核轮询:false]
另外,对于初学者来说,任何对调试器有益的建议都是非常受欢迎的。如果我是正确的,out函数的输出应该是一个列表。我没有检查您的全部代码,但以下内容应该可以工作:
<erl>
out(Arg) ->
[{ehtml,
{table, [{width, "100%"}],
{tr,[],
[{td, [{width, "50%"}], "hello world!"},
{td, [{width, "50%"}], "hi again."}]
}
}
}].
</erl>
输出(Arg)->
[{ehtml,
{table,[{width,“100%”表格],
{tr,[],
[{td,[{width,“50%”,“}”,“你好,世界!”,
{td,[{width,“50%”,“}],“你好。”}]
}
}
}].
如果我是正确的,out函数的输出应该是一个列表。我没有检查您的全部代码,但以下应该可以工作:
<erl>
out(Arg) ->
[{ehtml,
{table, [{width, "100%"}],
{tr,[],
[{td, [{width, "50%"}], "hello world!"},
{td, [{width, "50%"}], "hi again."}]
}
}
}].
</erl>
输出(Arg)->
[{ehtml,
{table,[{width,“100%”表格],
{tr,[],
[{td,[{width,“50%”,“}”,“你好,世界!”,
{td,[{width,“50%”,“}],“你好。”}]
}
}
}].
对于调试,我认为使用Erlang跟踪会很有帮助。我们想弄清楚为什么yaws_server:skip_data/2
函数会得到一个错误匹配
异常,特别是为什么它会得到一个传递给它的空二进制文件,因为这是它遇到该错误的唯一方法。因此我们需要跟踪该情况n、 尝试以下步骤(不要忘记每个erlangshell命令的尾随句点):
yaws-i
dbg
创建一个跟踪函数,这样我们就可以从跟踪数据中得到一个合理格式的回溯:F=fun({trace,,,,,Dump},[])->io:format(~s~n),[binary_to_list(Dump)],[]end.
dbg:tracer(进程,{F,[]})。
dbg:p(all,call)。
yaws\u server:skip\u data/2
获取一个空二进制文件作为第一个参数的条件,当它这样做时,获取一个回溯:
dbg:tpl(yaws_server,skip_data,dbg:fun2ms(fun([<<>>, _]) -> message(process_dump()) end)).
dbg:tpl(yaws_服务器,跳过_数据,dbg:fun2ms(fun([,])->消息(process_dump())end))。
有了这个,开始点击你的
.yaws
页面,直到你触发了这个条件,这时一个回溯将显示在你的Erlang外壳中。如果你得到了回溯,请将它复制到一个or中,并在这里发布一个指向它的链接作为后续操作。对于调试,我认为使用Erlang跟踪会很有帮助但是为什么yaws\u服务器:skip\u data/2
函数会得到一个badmatch
异常,特别是为什么它会得到一个传递给它的空二进制文件,因为这是它遇到该错误的唯一方式。所以我们需要跟踪该情况。尝试以下步骤(不要忘记每个Erlang shell命令的尾随时间):
yaws-i
dbg
创建一个跟踪函数,这样我们就可以从跟踪数据中得到一个合理格式的回溯:F=fun({trace,,,,,Dump},[])->io:format(~s~n),[binary_to_list(Dump)],[]end.
dbg:tracer(进程,{F,[]})。
dbg:p(all,call)。
yaws\u server:skip\u data/2
获取一个空二进制文件作为第一个参数的条件,当它这样做时,获取一个回溯:
dbg:tpl(yaws_server,skip_data,dbg:fun2ms(fun([<<>>, _]) -> message(process_dump()) end)).
dbg:tpl(yaws_服务器,跳过_数据,dbg:fun2ms(fun([,])->消息(process_dump())end))。
完成此操作后,开始点击
.yaws
页面,直到触发该条件,此时将在Erlang shell中显示回溯。如果获得回溯,请将其复制到or中,并在此处发布指向该回溯的链接作为后续操作。这是可选的。您可以返回元组(本书前面的所有示例都只是一个元组)或者一个列表,如果您想说,可以将标题与t一起发送