代码不必用特殊的标记(比如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}]}]
类型说明:
erts 的Match Specification in Erlang这章详细说明了MatchSpec
to be continued...
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}]}]
代码
- 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
andtracer/0/2/3
). - 如果
Item
是一个all
原子, 系统的所有进程和以后建的进程都会被跟踪.它同样对通过n/1
ortracer/0/2/3
函数加入的节点有效. - 如果
Item是一个
new
原子,则现存的进程不受影响, 而后建立的进程则会被跟踪. 它同样对通过n/1
ortracer/0/2/3
函数加入的节点有效. - 如果
Item是一个
existing
原子,对现存的进程有效,对后来建立的进程无效.它同样对通过n/1
ortracer/0/2/3
函数加入的节点有效. - 如果
Item
既不是all
,new
,也不是existing原子
, 则注册了此名称的进程会被跟踪.此进程可能是一个远程进程(在另外的一个Erlang节点上). 这个节点必须在被跟踪节点列表中.
(见n/1
andtracer/0/2/3
). - 如果
Item
是一整数,则进程<item.1></item.1>
被跟踪 - 如果
Item
是一个元组{X, Y, Z}
, 则进程<x.y.z></x.y.z>
被跟踪
Flags
可以是一个原子,也可以是flags列表.
-
跟踪进程发送的消息
- 跟踪进程接收的消息
- 跟踪进程接收和发送的消息
- 依照系统定义的跟踪模式,来跟踪此进程关于全局函数的调用情况(见 tp/2).
-
跟踪与此进程相关的事件
-
让所有由当前被跟踪进程所创建的子进程,都继承其flags.
-
每当被跟踪进程链至
P2
时, 让P2继承其flags
-
和
sos
相同,但只有第一个子进程会继承. -
和
sol
相同,但只会在第一次调用link/1
时跟踪
s (send)
r (receive)
m (messages)
c (call)
p (procs)
sos (set on spawn)
sol (set on link)
sofs (set on first spawn)
sofl (set on first link)
-
所有flags都设上
-
清除所有flags
all
clear
erts 的Match Specification in Erlang这章详细说明了MatchSpec
to be continued...