Debugging 调试Erlang Webmachine资源函数

Debugging 调试Erlang Webmachine资源函数,debugging,erlang,webmachine,Debugging,Erlang,Webmachine,我正在尝试学习如何编写ErlangWebMachine资源。一个资源抛出一个错误,但我无法跟踪它。崩溃报告中的错误消息没有提供足够的信息 有没有办法在Erlangshell中测试这些函数 资源中的大多数函数都需要请求和上下文参数。但我不知道如何在浏览器中模拟这些参数 下面是示例代码 谢谢 LRP 示例代码: 我具体考虑了以下函数: content_types_provided(RD, Ctx) -> Path = wrq:disp_path(RD), {[{webmachine

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

有没有办法在Erlangshell中测试这些函数

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

下面是示例代码

谢谢

LRP

示例代码:

我具体考虑了以下函数:

content_types_provided(RD, Ctx) ->
   Path = wrq:disp_path(RD),
   {[{webmachine_util:guess_mime(Path), generate_body}],
   RD, Ctx}.
但是我当前的bug在init函数中

这很有效

调度规则:

{["blip"], zzz_resource, []}.
初始化:

初始化:


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


让我们从简单的事情开始:

您收到的错误告诉我,对
静态资源:资源\u exists/2
的调用导致对
文件名:join/1
的调用失败,因为它作为参数传递了
[]
。这将有助于你追踪这个问题

建议阅读:


追踪任何语言错误的粗略方法就是在战略位置添加打印语句。在这种情况下,您可以使用
io:format/2
erlang: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建议的各种技术外,您还应该学习使用该模块。它功能强大,可以让您实时跟踪函数和模块

例如,对于您的特定情况,假设您希望跟踪静态资源模块中的所有函数:

.. 1> dbg:tracer(). {ok,} 2> dbg:p(all,[c]). {ok,[{matched,nonode@nohost,25}]} 3> dbg:tp({static_resource, '_', '_'}, []). {ok,[{matched,nonode@nohost,5}]} ... .. 1> dbg:tracer()。 {好的,} 2> dbg:p(全部[c])。 {好的,[{匹配,nonode@nohost,25}]} 3> dbg:tp({static_资源,''''.','.'},[])。 {好的,[{匹配,nonode@nohost,5}]} ... 之后,无论何时调用static_资源模块,都会看到打印输出(包括函数调用中的所有函数参数)


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

这个错误似乎发生在静态资源中:资源存在:它的代码是什么?我认为如果OP可以共享整个模块代码会有所帮助,很难找出只有函数片段的错误。嗨@david,我正在取得进展。你是最棒的。谢谢,LRPI非常感谢你的建议,阿伦。我被围绕着Erlang的不可思议的工具集所震撼。我一定会把dbg放在我的箭袋里。我确实有Erlang编程,但没有深入研究后面的章节。但我现在正在进行认真的Erlang开发,所以是时候了。祝你一切顺利,LRP
...
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)
.. 1> dbg:tracer(). {ok,} 2> dbg:p(all,[c]). {ok,[{matched,nonode@nohost,25}]} 3> dbg:tp({static_resource, '_', '_'}, []). {ok,[{matched,nonode@nohost,5}]} ...