調試Erlang代碼有時可能會非常棘手,尤其是處理badmatch
錯誤。在一般情況下,兩個很好的指導方針,以保持有:
- 保持功能,短期直接
- 使用返回值如果可以的話,而不是綁定臨時變量(這會給你越來越
function_clause
錯誤等,這是方式的好處更多的信息)
這就是說,使用調試器通常需要快速到達錯誤的底部。我建議使用命令行調試器dbg
而不是圖形的debugger
(當你知道如何使用它時,它的速度會更快,而且你不必從Erlang shell切換到GUI)。
給你提供的樣品表達,情況往往是,你擁有的不僅僅是變量更被分配到其他變量(這是在二郎山完全沒有必要):
run(X, Y) ->
X = something(whatever),
Y = other:do(more_data),
調試這裏badmatch
錯誤輔助通過使用命令行調試:
1> dbg:tracer(). % Start the CLI debugger
{ok,<0.55.0>}
2> dbg:p(all, c). % Trace all processes, only calls
{ok,[{matched,[email protected],29}]}
3> dbg:tpl(my_module, something, x). % tpl = trace local functions as well
{ok,[{matched,[email protected],1},{saved,x}]}
4> dbg:tp(other, do, x). % tp = trace exported functions
{ok,[{matched,[email protected],1},{saved,x}]}
5> dbg:tp(my_module, run, x). % x means print exceptions
{ok,[{matched,[email protected],1},{saved,x}]} % (and normal return values)
查找在返回值{matched,_,1}
...如果這將是0
而不是1
(或更多)這意味着沒有任何功能符合該模式。 dbg
模塊的完整文檔可以在here找到。
鑑於這兩個something/1
和other:do/1
總是返回OK,下面會發生:
6> my_module:run(ok, ok).
(<0.72.0>) call my_module:run(ok,ok)
(<0.72.0>) call my_module:something(whatever)
(<0.72.0>) returned from my_module:something/1 -> ok
(<0.72.0>) call other:do(more_data)
(<0.72.0>) returned from other:do/1 -> ok
(<0.72.0>) returned from my_module:run/2 -> ok
ok
在這裏,我們可以看到整個呼叫過程,並給出了什麼樣的返回值。如果我們的東西把它叫做我們知道會失敗:
7> my_module:run(error, error).
** exception error: no match of right hand side value ok
(<0.72.0>) call my_module:run(error,error)
(<0.72.0>) call my_module:something(whatever)
(<0.72.0>) returned from my_module:something/1 -> ok
(<0.72.0>) exception_from {my_module,run,2} {error,{badmatch,ok}}
在這裏我們可以看到,我們得到了一個badmatch
例外,something/1
是所謂的,但從來沒有這麼other:do/1
我們可以推斷出badmatch這一呼籲之前發生的事情。
熟練使用命令行調試器將爲您節省大量時間,您是否調試簡單(但棘手!)badmatch
錯誤或更復雜的東西。
希望在Erlang R15出現異常行號的情況下,所有這些都會變得更簡單!
請選擇哪個答案解決您的問題,如果有的話。 –