Tracing和dbg

代码不必用特殊的标记(比如debug_info)来编译,也可以trace.

erlang:trace是最底层的BIF实现的trace功能。格式如下

erlang:trace(PidSpec,How,FlagList)

它要通过erlang:trace_pattern(MFA,MatchSpec,FlagList)来辅助输出.

MatchSpec这东西很难写,在dbg模块中可以用dbg:fun2ms,它可以把函数转成MatchSpec.

比如:
dbg:fun2ms(fun(_) -> return_trace() end).
相当于
[{'_',[],[{return_trace}]}]

 dbg:fun2ms(fun([M,N]) when N > 3 -> return_trace() end).
相当于
 [{['$1','$2'],[{'>','$2',3}],[{return_trace}]}]




代码
  1. dbg:p(Item, Flags) -> {ok, MatchDesc} | {error, term()}   
类型说明:

MatchDesc = [MatchNum]
MatchNum = {matched, node(), integer()} | {matched, node(), 0, RPCError}
RPCError = term()

Item

  • 如果Item是一个 pid(), 对应的进程会被跟踪.此进程可能是一个远程进程(在另外的一个Erlang节点上). 这个节点必须在被跟踪节点列表中. (见 n/1 and tracer/0/2/3).
  • 如果Item是一个all原子, 系统的所有进程和以后建的进程都会被跟踪.它同样对通过n/1 or tracer/0/2/3函数加入的节点有效. 
  • 如果Item是一个new原子,则现存的进程不受影响, 而后建立的进程则会被跟踪. 它同样对通过n/1 or tracer/0/2/3函数加入的节点有效. 
  • 如果Item是一个existing原子,对现存的进程有效,对后来建立的进程无效.它同样对通过n/1 or tracer/0/2/3函数加入的节点有效. 
  • 如果Item既不是all, new ,也不是existing原子, 则注册了此名称的进程会被跟踪.此进程可能是一个远程进程(在另外的一个Erlang节点上). 这个节点必须在被跟踪节点列表中. (见 n/1 and tracer/0/2/3).
  • 如果Item 是一整数,则进程 <item.1></item.1> 被跟踪
  • 如果Item是一个元组{X, Y, Z}, 则进程 <x.y.z></x.y.z>被跟踪

Flags可以是一个原子,也可以是flags列表. 

s (send)
跟踪进程发送的消息
r (receive)
跟踪进程接收的消息
m (messages)
跟踪进程接收和发送的消息
c (call)
依照系统定义的跟踪模式,来跟踪此进程关于全局函数的调用情况(见 tp/2).
p (procs)
跟踪与此进程相关的事件
sos (set on spawn)
让所有由当前被跟踪进程所创建的子进程,都继承其flags.
sol (set on link)
每当被跟踪进程链至 P2时, 让P2继承其flags
sofs (set on first spawn)
sos相同,但只有第一个子进程会继承.
sofl (set on first link)
sol相同,但只会在第一次调用 link/1时跟踪
all
所有flags都设上
clear
清除所有flags


erts 的Match Specification in Erlang这章详细说明了MatchSpec

to be continued...

你可能感兴趣的:(erlang)