Debugging 如何将erlang dbg附加到正在运行的进程?

Debugging 如何将erlang dbg附加到正在运行的进程?,debugging,erlang,rabbitmq,rabbitmq-exchange,Debugging,Erlang,Rabbitmq,Rabbitmq Exchange,如何将调试器附加到正在运行的erlang进程(rabbitmq)?我有与正在运行的rabbit版本相同的源代码。我想在源代码行上设置断点,并将调试器附加到正在运行的rabbit实例。我不确定erlang是否需要异步调试符号 在一个完美的世界里,我希望能够在本地和远程都做到这一点。您可以使用图形或在shell中使用模块。 需要使用选项编译模块 可以使用调试器从连接的节点远程调试进程:启动(全局)或连接到远程shell(^G)。根据您的说法,您实际上不需要运行调试器。ErlangVM的并发模型不适合

如何将调试器附加到正在运行的erlang进程(rabbitmq)?我有与正在运行的rabbit版本相同的源代码。我想在源代码行上设置断点,并将调试器附加到正在运行的rabbit实例。我不确定erlang是否需要异步调试符号

在一个完美的世界里,我希望能够在本地和远程都做到这一点。

您可以使用图形或在shell中使用模块。 需要使用选项编译模块


可以使用调试器从连接的节点远程调试进程:启动(全局)或连接到远程shell(^G)。

根据您的说法,您实际上不需要运行调试器。ErlangVM的并发模型不适合停止一切并检查式调试的概念

另一方面,VM具有强大的内置跟踪功能。
dbg
模块是它们全部公开的地方,但是该模块的接口很难使用,特别是如果您是初学者的话。 我建议您使用
recon\u trace
查看您的流程中发生了什么:

如果不想安装recon,请从Erlang shell启动程序,然后在该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
查看下面的课程,在那里我摸索着不知道如何使用
队列
模块:

Eshell V6.3  (abort with ^G)
1> dbg:tracer(), dbg:tpl(queue, x), dbg:p(all, call).
{ok,[{matched,nonode@nohost,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]}
eShellV6.3(使用^G中止)
1> dbg:tracer(),dbg:tpl(队列,x),dbg:p(全部,调用)。
{好的,[{匹配,nonode@nohost,26}]}
2> X=队列:新建()。
()呼叫队列:新建()
()从队列返回:新建/0->{[],[]}
{[],[]}
3> X=队列:cons(1)。
**异常错误:未定义的函数队列:cons/1
4> X=队列:cons(X,1)。
()呼叫队列:cons({[],[]},1)
()呼叫队列:in_r({[],[]},1)
()来自{queue,in_r,2}{error,badarg}的异常
()来自{queue,cons,2}{error,badarg}的异常
**异常错误:参数错误
在功能队列中:在\r/2中
被称为队列:in_r({[],[]},1)
5> X=队列:cons(1,X)。
()呼叫队列:cons(1,{[],[]})
()呼叫队列:in_r(1,{[],[]})
()从队列返回:in_r/2->{[],[1]}
()从队列返回:cons/2->{[],[1]}
**异常错误:右侧值{[],[1]}不匹配
6> X1=队列:cons(1,X)。
()呼叫队列:cons(1,{[],[]})
()呼叫队列:in_r(1,{[],[]})
()从队列返回:in_r/2->{[],[1]}
()从队列返回:cons/2->{[],[1]}
{[],[1]}
希望这能帮助你开始

如果您想查看Erlang向导是如何实现的,请观看。

Erlang文档页面:(无用户指南)、
debugger
以及相关的SO线程:,