为什么要trace机制
因为erlang很多进程,用debuger来调试有点痛苦,如果用log的话,要在代码里面写入对应的“眼”,累了程序员不说,还影响了性能。而erlang提供了强大的trace机制,可以更好的了解整个系统的所有情况。
dbg:tracer用法
-
dbg:tracer().
开启dbg的tracer -
dbg:p(Item, Flags) -> {ok, MatchDesc} | {error, term()}
设置跟踪属性.
第一个参数Item是设定要跟踪的对象:-
如果Item是一个pid(),则只会trace 对应的进程,如果是在集群中,只要节点在traced nodes列表内,可以跨节点trace那个进程.
-
如果Item是一个atom all,就会trace 整个系统所有的进程,同样可以监控整个集群。
-
如果Item是一个atom new,就会trace 系统在此刻开始所创建的新进程,可以监控整个集群。
-
如果Item是一个atom existing,就会trace 系统此刻之前所创建的进程,可以监控整个集群。
第二个参数Flags是设置要监听的动作:
-
s(send) trace 进程发送的消息
-
r(receive) trace 进程受到的消息
-
m(messages) trace 进程收的或者发的消息 -.- m = s+r
-
c(call) 通过tp/2设置的匹配规则后,可以trace 进程所有的call匹配的动作。
-
p(procs) trace 与目标进程相关联的进程
-
sos(set on spwan) 使监控的进程所产生的进程继承所以trace flags
-
sol (set on link) 如果有另外的进程p2 link被监控的进程,p2会继承所有的trace flags
-
all 所有的flags
-
clear 清除所有flags
-
-
dbg:tp({Module, Function, Arity}, MatchSpec) -> {ok, MatchDesc} | {error, term()} 与 dbg:tpl({Module, Function, Arity}, MatchSpec) -> {ok, MatchDesc} | {error, term()}
tpl和tp类似,只是tpl会trace 未导出函数。
-
dbg:tpl(Module, '_', []). 会trace 该module的所有的调用。
-
dbg:tpl(Module, Function, '_', []). 会trace module:function,不限定参数个数。
-
dbg:tpl(Module, Function, Arity, []). trace module:function/arity。
-
dbg:tpl(M, F, A, [{'_', [], [{return_trace}]}]). 会跟踪返回值。
-
附上自家项目用的tracer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
|