调试Erlang Webmachine资源函数



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

是否有办法在Erlang shell中测试这些函数?

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

示例代码如下:

谢谢,

部队

示例代码:

我正在考虑具体的函数,如:

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},

这个答案有很多层次,取决于你想看到什么,以及你想深入到什么程度。


让我们从简单的开始:

你得到的错误告诉我,对static_resource:resource_exists/2的调用导致对filename:join/1的调用失败,因为它传递了[]作为其参数。这应该能帮助你找到问题所在。

推荐阅读:errors-and-exceptions


在任何语言中追踪错误的一个简单方法就是在关键位置添加print语句。在这种情况下,您可以使用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,可以阅读这篇文章。您可以使用上述方法,但是如果您需要查看决策图,则执行完整跟踪可能会有所帮助。

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

作为一个例子,对于您的特殊情况,假设您想要跟踪static_resource模块中的所有函数:

<>之前..1> dbg:示踪剂()。{好吧,}2> dbg: p (, [c])。{好吧,[{匹配nonode@nohost 25}]}3> dbg:tp({static_resource, '_', '_'},[])。{好吧,[{匹配nonode@nohost 5}]}…之前

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

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

相关内容

  • 没有找到相关文章

最新更新