如何將調試器附加到正在運行的erlang進程(rabbitmq)?我有運行相同的兔子版本的源代碼。我想在源代碼行上設置斷點,並將調試器附加到正在運行的兔子實例。我不確定erlang是否需要調試符號async_dirty。如何將erlang dbg附加到正在運行的進程?
在一個完美的世界中,我希望能夠做到這一點,無論是本地和遠程。
我是這樣一個erlang初學者,我甚至不會說我是erlang的新手。我只是想在我調試一些rabbitmq插件時學習它。
如何將調試器附加到正在運行的erlang進程(rabbitmq)?我有運行相同的兔子版本的源代碼。我想在源代碼行上設置斷點,並將調試器附加到正在運行的兔子實例。我不確定erlang是否需要調試符號async_dirty。如何將erlang dbg附加到正在運行的進程?
在一個完美的世界中,我希望能夠做到這一點,無論是本地和遠程。
我是這樣一個erlang初學者,我甚至不會說我是erlang的新手。我只是想在我調試一些rabbitmq插件時學習它。
從你所說的話來看,你並不需要運行一個調試器。 Erlang虛擬機的併發模型並不適用於stop-everything-and-inspect-style調試的概念。
另一方面,VM具有很好的內置跟蹤功能。 dbg
模塊是他們全部暴露的地方,但該模塊的界面非常難以使用,特別是如果您是初學者。 我建議使用recon_trace
來了解您的流程發生了什麼:http://ferd.github.io/recon/recon_trace.html。
如果你不喜歡安裝偵察,從Erlang shell的啓動程序,並且在外殼中,鍵入:
%enable tracing capabilities
1> dbg:tracer().
% Trace Pattern Local-scope
% (tell the tracer to trace every call in YourModule, even unexported functions).
2> dbg:tpl(YourModule, x).
% Tell dbg to print calls from all processes calling your module.
3> dbg:p(all,call).
% Run your traced module
4> YourModule:SomeFun().
% You should see nice(?) traces of inputs, outputs, and
% exceptions in your shell
看看下面的會議,我在那裏四處摸索,不知道如何使用queue
模塊:
Eshell V6.3 (abort with ^G)
1> dbg:tracer(), dbg:tpl(queue, x), dbg:p(all, call).
{ok,[{matched,[email protected],26}]}
2> X = queue:new().
(<0.33.0>) call queue:new()
(<0.33.0>) returned from queue:new/0 -> {[],[]}
{[],[]}
3> X = queue:cons(1).
** exception error: undefined function queue:cons/1
4> X = queue:cons(X,1).
(<0.39.0>) call queue:cons({[],[]},1)
(<0.39.0>) call queue:in_r({[],[]},1)
(<0.39.0>) exception_from {queue,in_r,2} {error,badarg}
(<0.39.0>) exception_from {queue,cons,2} {error,badarg}
** exception error: bad argument
in function queue:in_r/2
called as queue:in_r({[],[]},1)
5> X = queue:cons(1,X).
(<0.41.0>) call queue:cons(1,{[],[]})
(<0.41.0>) call queue:in_r(1,{[],[]})
(<0.41.0>) returned from queue:in_r/2 -> {[],[1]}
(<0.41.0>) returned from queue:cons/2 -> {[],[1]}
** exception error: no match of right hand side value {[],[1]}
6> X1 = queue:cons(1,X).
(<0.43.0>) call queue:cons(1,{[],[]})
(<0.43.0>) call queue:in_r(1,{[],[]})
(<0.43.0>) returned from queue:in_r/2 -> {[],[1]}
(<0.43.0>) returned from queue:cons/2 -> {[],[1]}
{[],[1]}
希望這有助於幫助您入門。
如果您想了解Erlang嚮導如何執行此操作,請參見this presentation。
您可以使用圖形debugger或使用int模塊的shell。 需要使用debug_info選項編譯模塊。
可以使用調試器從連接的節點遠程調試進程:start(global)或連接到遠程shell(^ G)。