2011-08-04 8 views
3

Erlang Webmachineリソースの記述方法を学習しようとしています。 1つのリソースがエラーをスローしますが、私はそれを追跡できません。クラッシュレポートのエラーメッセージは、十分な情報を提供していません。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}, 
+0

static_resourceでエラーが発生しているようです:resource_exists:コードは何ですか? –

答えて

4

層の多くは、あなたが見てどのように深いあなたが行きたいウサギの穴ダウンしたいのかに応じて、この答えにあります。


のは簡単なものから始めましょう:

あなたが取得しているエラーがstatic_resource:resource_exists/2の呼び出しが、それはその引数として[]を渡されたために失敗しfilename:join/1への呼び出しをもたらしたことを私に伝えます。それは問題を追跡するのに役立ちます。

推奨読書:errors-and-exceptions


任意の言語でエラーを追跡するために、粗な方法は、ちょうど戦略的loctationsでprint文を追加することです。この場合、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、あなたはthisを読むことができます。上記でかなり遠くまで到達することができますが、完全なトレースを行うことは、決定グラフを表示する必要がある場合に役立ちます。

+0

私は、OPがモジュールコード全体を共有することができれば、機能の断片だけで何が問題なのか把握するのは難しいと思います。 –

+0

こんにちは@ダビッド、私は前進しています。あなたは最高です。ありがとう、LRP –

+0

クール。私は幸せな助けです。 :) –

2

デビッドが示唆しているさまざまな技術に加えて、dbgモジュールの使用方法も学ぶ必要があります。信じられないほど強力で、リアルタイムで機能やモジュールをトレースすることができます。

例として、あなたの特定のケースのために、あなたはstatic_resourceモジュール内のすべての機能をトレースしたいと:あなたは、プリントアウトが(関数呼び出し内のすべての関数パラメータをincluds)が表示されます

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

た後static_resourceモジュールがどこでも呼び出されるたびに。

dbgの詳細な説明は、この小さな回答スペースの対象外です。私はO'riellyのErlang Programming本をお勧めします。 Chaper 17には、それをどのように使用するかについての非常に素晴らしい記事とチュートリアルがあります。dbgとそのさまざまなトレース機能。

+0

私は本当にこの提案、アルンに感謝します。私はErlangを囲む信じられないほどのツールセットを吹き飛ばした。私は間違いなく私の震えにdbgを入れます。私はErlang Programmingを持っていますが、後の章で詳しく説明していません。しかし、私は今、真剣なErlangの開発を行っているので、時間があります。すべてのベスト、LRP –

+0

助けてうれしい:) –