3

我正在尝试学习如何编写 Erlang Webmachine 资源。一个资源引发错误,但我无法追踪它。崩溃报告中的错误消息没有提供足够的信息。

有没有办法在 Erlang shell 中测试这些功能?

资源中的大多数功能都需要请求和上下文参数。但我不知道如何在浏览器中模拟这些参数。

下面的示例代码。

谢谢,

LRP

示例代码:

我正在特别考虑以下功能:

content_types_provided(RD, Ctx) ->
   Path = wrq:disp_path(RD),
   {[{webmachine_util:guess_mime(Path), generate_body}],
   RD, Ctx}.

但我当前的错误在 init 函数中。

这有效...

发货规则:

{["blip"], zzz_resource, []}.

在里面:

init([]) -> {ok, undefined}.

to_html(ReqData, State) ->
    % {"<html><bodoy>Hello, new world</body></html>", ReqData, State}.
        {test:test(), ReqData, State}.

但这会引发错误:

派遣:

{["static"], static_resource,[]}.

在里面:

init(_) ->
   DocRoot =
       case init:get_argument(doc_root) of
          {ok, [[DR]]} -> DR;
           error -> "doc_root path error"
       end,
   {ok, #ctx{docroot=DocRoot}}.

=ERROR REPORT==== 4-Aug-2011::10:54:56 ===
webmachine error: path="/static"
{error,function_clause,
   [{filename,join,[[]]},
    {static_resource,resource_exists,2},
4

2 回答 2

4

这个答案有很多层次,这取决于你想看到什么以及你想去兔子洞的深度。


让我们从简单的东西开始:

您收到的错误告诉我,调用static_resource:resource_exists/2导致调用filename:join/1失败,因为它是[]作为参数传递的。这应该可以帮助您找出问题所在。

推荐阅读:错误和异常


追踪任何语言错误的粗略方法就是在战略位置添加打印语句。在这种情况下,您可以使用io:format/2erlang:display/1向控制台显示您想要的任何内容。例如:

...
erlang:display("I'm inside resource_exists!"),
StuffToJoin = ["foo", "bar"],
erlang:display(StuffToJoin),
filename:join(StuffToJoin),
...

只需重新加载页面,您应该会在控制台中看到打印的值(假设在重新加载过程中调用了适当的函数)。


如果您想手动测试资源(例如在单元测试中),您可以执行以下操作:

Headers = [{"Host", "mydomain.com"}, {"user-agent", "Firefox"}],
Context = [],
Path = "/static",
ReqData = wrq:create('GET', {1,1}, Path, mochiweb_headers:from_list(Headers)),
static_resource:resource_exists(ReqData, Context)

如果您想深入了解如何调试 webmachine,可以阅读. 您可以通过上述方法取得相当大的进展,但如果您需要查看决策图,则进行完整跟踪可能会有所帮助。

于 2011-08-04T18:59:11.720 回答
2

除了 David 建议的各种技术之外,您还应该学习使用dbg模块。它非常强大,可让您实时跟踪功能和模块。

例如,对于您的特定情况,假设您要跟踪 static_resource 模块中的所有函数:

..
1> 数据库:示踪剂()。
{行,}
2> dbg:p(全部,[c])。
{ok,[{matched,nonode@nohost,25}]}
3> dbg:tp({static_resource, '_', '_'}, [])。
{ok,[{matched,nonode@nohost,5}]}
...

之后,无论何时在任何地方调用 static_resource 模块,您都会看到一个打印输出(包括函数调用中的所有函数参数)。

完整的描述dbg超出了这个小答案空间的范围。我推荐 O'rielly 的Erlang Programming一书。第 17 章有一篇非常棒的文章和教程,介绍了如何使用它dbg及其各种跟踪功能。

于 2011-08-05T03:40:19.247 回答