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

Я пытаюсь научиться писать ресурсы 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([]) -> {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},

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)

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

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

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

..
1> dbg: tracer ().
{Хорошо,}
2> dbg:p(все,[c]). 
{ОК,[{совпадают,nonode@nohost,25}]} 
3> dbg:tp({static_resource, '_', '_'}, []). 
{ОК,[{совпадают,nonode@nohost,5}]}
...

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

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

Другие вопросы по тегам