为什么要trace机制

为什么要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
         
         
%%%-------------------------------------------------------------------
%%% @author dp <>
%%% @copyright (C) 2012, dp
%%% @doc
%%% 项目的tracer ,用于运行时排错
%%% @end
%%% Created : 16 Oct 2012 by dp <>
%%%-------------------------------------------------------------------
-module(dika_tracer).
%% API
-export([t/3,t/2,t/1,stop/0,p/1]).
 
%%%===================================================================
%%% API
%%%===================================================================
 
%% 指定要监控的模块,函数,函数的参数个数
t(Mod)->
dbg:tpl(Mod,[{'_', [], [{return_trace}]}]).
 
 
%% 指定要监控的模块,函数
t(Mod,Fun)->
dbg:tpl(Mod,Fun,[{'_', [], [{return_trace}]}]).
 
 
%% 指定要监控的模块,函数,函数的参数个数
t(Mod,Fun,Ari)->
dbg:tpl(Mod,Fun,Ari,[{'_', [], [{return_trace}]}]).
 
 
 
%%开启tracer。Max是记录多少条数据
p(Max)->
FuncStopTracer =
fun
(_, N) when N =:= Max-> % 记录累计到上限值,追踪器自动关闭
dbg:stop_clear(),
io:format("#WARNING >>>>>> dbg tracer stopped <<<<<<~n~n",[]);
(Msg, N) ->
case Msg of
{trace, _Pid, call, Trace} ->
{M, F, A} = Trace,
io:format("###################~n",[]),
io:format("call [~p:~p,(~p)]~n", [M, F, A]),
io:format"###################~n",[]);
{trace, _Pid, return_from, Trace, ReturnVal} ->
{M, F, A} = Trace,
io:format("===================~n",[]),
io:format("return [~p:~p(~p)] =====>~p~n", [M, F, A, ReturnVal]),
io:format("===================~n",[]);
_ -> skip
end,
N + 1
end,
case dbg:tracer(process, {FuncStopTracer, 0}) of
{ok, _Pid} ->
dbg:p(all, [all]);
{error, already_started} ->
skip
end.
 
stop()->
dbg:stop_clear().
 
%%%===================================================================
%%% Internal functions
%%%===================================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值