为什么要trace机制
来源:互联网 发布:破解软件分享网站 编辑:程序博客网 时间:2024/05/16 15:09
为什么要trace机制
因为erlang很多进程,用debuger来调试有点痛苦,如果用log的话,要在代码里面写入对应的“眼”,累了程序员不说,还影响了性能。而erlang提供了强大的trace机制,可以更好的了解整个系统的所有情况。
dbg:tracer用法
dbg:tracer().
开启dbg的tracerdbg: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
%%%-------------------------------------------------------------------%%% @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",[]);_ -> skipend,N + 1end,case dbg:tracer(process, {FuncStopTracer, 0}) of{ok, _Pid} ->dbg:p(all, [all]);{error, already_started} ->skipend.stop()->dbg:stop_clear().%%%===================================================================%%% Internal functions%%%===================================================================
- 为什么要trace机制
- 为什么要使用反射机制
- 为什么要使用反射机制
- 为什么要使用反射机制
- Struts工作机制?为什么要使用Struts?
- spring工作机制及为什么要用?
- Struts工作机制?为什么要使用Struts?
- spring工作机制及为什么要用?
- Struts工作机制?为什么要使用Struts?
- Struts工作机制?为什么要使用Struts?
- spring工作机制及为什么要用
- Spring工作机制及为什么要用?
- Struts工作机制?为什么要使用Struts?
- spring工作机制及为什么要用?
- spring工作机制及为什么要用?
- Struts工作机制?为什么要使用Struts?
- spring工作机制及为什么要用?
- Struts1工作机制?为什么要使用Struts?
- 这就是生活--1
- iOS UIButtom控件的使用方法
- HDU1042 N! (大精度)
- Android Push Notifications using Google Cloud Messaging GCM
- sgu183 Painting the balls_dp
- 为什么要trace机制
- 2014.08.19 周二-eclipse运行,快捷键-Mapping传参-web映射虚拟目录
- Sort List
- java action中存Map 在jsp中使用struts2标签 通过map[key]取值
- 比特币交易所要不要100%准备金
- TCO14 1B L3: EagleInZoo, dp,tree
- ubuntu 14.04强制安装ia32-libs
- myeclipse 工程导入 eclipse
- WEB程序发布方式