2011-08-04 31 views
3

我在學習如何編寫Erlang Webmachine資源。一個資源會引發錯誤,但我無法追蹤它。崩潰報告中的錯誤消息沒有提供足夠的信息。調試Erlang Webmachine資源功能

有沒有辦法在Erlang shell中測試這些函數?

資源中的大部分功能都需要請求和上下文參數。但我不知道如何在瀏覽器中模擬這些參數。

下面的示例代碼。

感謝,

LRP

示例代碼:

我特別喜歡思考的功能:

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

但我目前的bug是在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}, 
+0

該錯誤似乎發生在static_resource:resource_exists:它的代碼是什麼? –

回答

4

有很多層,這個答案取決於你希望看到什麼,以及如何在內心深處的兔子洞你想去的地方。


讓我們先從簡單的東西:

你所得到的錯誤告訴我,到static_resource:resource_exists/2調用導致到filename:join/1調用它失敗,因爲它傳遞[]作爲其參數。這應該有助於你追蹤這個問題。

推薦閱讀:errors-and-exceptions


原始方法在任何語言來追查錯誤就是在戰略loctations添加打印語句。在這種情況下,您可以使用io:format/2erlang: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

嗨@david,我正在取得進展。你是最好的。謝謝,LRP –

+0

很酷。我很高興幫助。 :) –

2

除了David建議的各種技術外,您還應該學習使用dbg模塊。它非常強大,可讓您實時跟蹤功能和模塊。

作爲一個例子,爲您的特定情況下,假設你要跟蹤的static_resource模塊的所有功能:

 
.. 
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有一個非常棒的書寫和教程,介紹如何使用它以及其各種跟蹤功能。

+0

我真的很感謝這個建議,Arun。我被圍繞Erlang的令人難以置信的工具所迷惑。我一定會把dbg放在我的箭袋裏。我有Erlang編程,但對後面的章節沒有深入研究。但是我現在正在嚴肅的Erlang開發中,所以是時候了。一切順利,LRP –

+0

很高興有幫助:) –