Отладка функций ресурсов Erlang Webmachine

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

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

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

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

Спасибо,

ЛРП

Пример кода:

Я имею в виду конкретно такие функции, как:

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

Но моя текущая ошибка в функции инициализации.

Это работает...

Правило отправки:

{["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},

person Lloyd R. Prentice    schedule 04.08.2011    source источник
comment
Кажется, ошибка возникает в static_resource:resource_exists: каков ее код?   -  person David Dossot    schedule 04.08.2011


Ответы (2)


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


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

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

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

person David Weldon    schedule 04.08.2011
comment
Я думаю, было бы полезно, если бы OP мог поделиться всем кодом модуля, трудно понять, что не так только с фрагментами функций. - person David Dossot; 05.08.2011
comment
Привет @david, я делаю успехи. Ты лучший. Спасибо, ЛРП - person Lloyd R. Prentice; 05.08.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. В Главе 17 есть действительно потрясающая статья и руководство о том, как использовать его dbg и его различные функции трассировки.

person arun_suresh    schedule 05.08.2011
comment
Я очень ценю это предложение, Арун. Я поражен невероятным набором инструментов, окружающих Erlang. Я обязательно положу dbg в свой колчан. У меня есть программирование на Erlang, но я недостаточно глубоко вникал в последующие главы. Но я только сейчас занимаюсь серьезной разработкой Erlang, так что пришло время. Всего наилучшего, ЛРП - person Lloyd R. Prentice; 07.08.2011