Debugging Yaws进程已终止:{{badmatch,<;<;>;}

Debugging Yaws进程已终止:{{badmatch,<;<;>;},debugging,erlang,yaws,erl,Debugging,Erlang,Yaws,Erl,在使用yaws时,我正在浏览一本非常基本的erlang手册。我正在编辑一个yaws文件并刷新浏览器。通常(现在是第三次)该过程会显示此错误。我会不断查找语法错误或其他任何错误,最终我只需重新启动该过程,一切正常。对源文件没有任何更改 现在这是上次触发错误的源文件 <erl> out(Arg) -> {ehtml, {table, [{width, "100%"}], {tr,[],

在使用yaws时,我正在浏览一本非常基本的erlang手册。我正在编辑一个yaws文件并刷新浏览器。通常(现在是第三次)该过程会显示此错误。我会不断查找语法错误或其他任何错误,最终我只需重新启动该过程,一切正常。对源文件没有任何更改

现在这是上次触发错误的源文件

<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:
    yaws-i
  • 一旦出现yaws,点击enter以获得erlangshell提示
  • 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:
    yaws-i
  • 一旦出现yaws,点击enter以获得erlangshell提示
  • 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一起发送