Отладка функций ресурса Erlang Webmachine - PullRequest
3 голосов
/ 04 августа 2011

Я пытаюсь научиться писать ресурсы Erlang Webmachine. Один ресурс выдает ошибку, но я не могу отследить ее. Сообщение об ошибке в отчете о сбое не предоставляет достаточно информации.

Есть ли способ протестировать эти функции в оболочке Erlang?

Большинству функций в ресурсе требуются параметры запроса и контекста. Но я не знаю, как смоделировать эти параметры в браузере.

Пример кода ниже.

Спасибо

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:

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

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

Но это выдает ошибку:

Отправка товара:

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

Init:

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

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

В этом ответе много слоев, в зависимости от того, что вы хотите увидеть и как глубоко в кроличью нору вы хотите пройти.


Давайте начнем с простых вещей:

Ошибка, которую вы получаете, говорит мне, что вызов static_resource:resource_exists/2 привел к вызову filename: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)

Если вы хотите подробно изучить, как отлаживать веб-машину, вы можете прочитать это .Вы можете довольно далеко продвинуться выше, но полная трассировка может быть полезна, если вам нужно увидеть график решений.

2 голосов
/ 05 августа 2011

В дополнение к различным методам, предложенным Дэвидом, вы также должны научиться использовать модуль dbg . Это невероятно мощный и позволяет отслеживать функции и модули в режиме реального времени.

В качестве примера для вашего конкретного случая предположим, что вы хотите отследить все функции в модуле static_resource:

..
1> dbg:tracer().
{ok,}
2> dbg:p(all,[c]). 
{ok,[{matched,nonode@nohost,25}]} 
3> dbg:tp({static_resource, '_', '_'}, []). 
{ok,[{matched,nonode@nohost,5}]}
...

после чего вы увидите распечатку (включая все параметры функции в вызове функции) всякий раз, когда модуль static_resource вызывается где-либо.

Полное описание dbg выходит за рамки этого небольшого пространства ответов. Я рекомендую книгу О'Риелли Erlang Programming . У Chaper 17 есть действительно классная статья и руководство по использованию dbg и его различным функциям трассировки.

...