3 Stimmen

Debuggen von Erlang Webmachine-Ressourcenfunktionen

Ich versuche zu lernen, wie man Erlang Webmachine-Ressourcen schreibt. Eine Ressource löst einen Fehler aus, aber ich kann ihn nicht aufspüren. Die Fehlermeldung im Absturzbericht liefert nicht genügend Informationen.

Gibt es eine Möglichkeit, diese Funktionen in der Erlang-Shell zu testen?

Die meisten Funktionen der Ressource erfordern Anforderungs- und Kontextparameter. Ich weiß aber nicht, wie ich diese Parameter im Browser simulieren kann.

Beispielcode unten.

Danke,

LRP

Beispiel-Code:

Ich denke dabei insbesondere an Funktionen wie:

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

Aber mein aktueller Fehler liegt in der init-Funktion.

Das funktioniert...

Versendungsregel:

{["blip"], zzz_resource, []}.

Einleitung:

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

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

Dies führt jedoch zu einem Fehler:

Versenden:

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

Einleitung:

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

4voto

David Weldon Punkte 61742

Die Antwort ist vielschichtig, je nachdem, was Sie sehen wollen und wie tief Sie in den Kaninchenbau vordringen wollen.


Fangen wir mit den einfachen Dingen an:

Der Fehler, den Sie erhalten, sagt mir, dass ein Aufruf von static_resource:resource_exists/2 führte zu einem Aufruf an filename:join/1 das gescheitert ist, weil es verabschiedet wurde [] als sein Argument. Das sollte Ihnen helfen, das Problem zu finden.

Empfohlene Lektüre: Fehler und Ausnahmen


Eine einfache Möglichkeit, Fehler in jeder Sprache aufzuspüren, besteht darin, an strategischen Stellen Druckanweisungen einzufügen. In diesem Fall können Sie io:format/2 o erlang:display/1 um auf der Konsole anzuzeigen, was Sie wollen. Zum Beispiel:

...
erlang:display("I'm inside resource_exists!"),
StuffToJoin = ["foo", "bar"],
erlang:display(StuffToJoin),
filename:join(StuffToJoin),
...

Laden Sie die Seite einfach neu, und Sie sollten den Wert in der Konsole sehen (vorausgesetzt, die entsprechende Funktion wurde im Rahmen des Neuladens aufgerufen).


Wenn Sie eine Ressource manuell testen möchten (z. B. in einem Einheitstest), können Sie etwa wie folgt vorgehen:

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)

Wenn Sie einen tieferen Einblick in die Fehlersuche bei Webmaschinen haben möchten, können Sie lesen este . Damit kommt man ziemlich weit, aber eine vollständige Aufzeichnung kann hilfreich sein, wenn man die Entscheidungsgrafik sehen will.

2voto

arun_suresh Punkte 2847

Zusätzlich zu den verschiedenen Techniken, die David vorgeschlagen hat, sollten Sie auch lernen, die dbg Modul. Es ist unglaublich leistungsfähig und ermöglicht es Ihnen, Funktionen und Module in Echtzeit zu verfolgen.

Nehmen wir an, Sie möchten alle Funktionen des Moduls static_resource verfolgen:

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

Danach wird bei jedem Aufruf des Moduls static_resource ein Ausdruck (einschließlich aller Funktionsparameter im Funktionsaufruf) angezeigt.

Eine vollständige Beschreibung der dbg übersteigt den Rahmen dieses kleinen Antwortbereichs. Ich empfehle O'rielly's Erlang-Programmierung Buch. In Kapitel 17 gibt es einen wirklich tollen Bericht und eine Anleitung, wie man es benutzt dbg und seine verschiedenen Spurenelemente.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X