Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
94 lines (77 sloc) 3.69 KB
NAME
redbug - restricted debugging utility
SYNOPSIS
redbug:start(Time,Msgs,Trc[,Proc[,Where[,Target]]]) -> pid()|EXIT
redbug:stop([Target]) -> atom()
DESCRIPTION
An interface to the Erlang trace mechanism, safer (hopefully) than
dbg. Disallows some of the more dangerous traces and exits if it
gets flooded by trace messages. It runs in the background,
collecting trace messages, until it reaches one of it's termination
criteria (number of messages/file size or elapsed time). Upon termination,
it will send the atom 'stop' to the process that started it.
Time - integer() number of milliseconds to run for
Msgs - integer() number of messages to collect
Trc - list('send'|'receive'|RTP).
RTP - tuple {Module, Function}|{Module, Function, list(RMS)}
RMS - 'stack'|'return'|ALD. Restricted Match Spec. Using 'stack'
will include the call return stack, 'return' will include the return
value of the call.
ALD - tuple(). Argument List Description. Tuple with the same arity
as the traced function. It can contain constants (atoms and numbers)
and the wildcard; '_'. E.g. the ALD; {1,'_',x} would match if the
arity of the called function is 3, the first argument is 1 and the
third argument is 'x'. There can only be one ALD per RTP.
Proc - 'all'|atom(RegisteredName),pid(),{pid,I1,I2} (which specifies
the pid <0.I1.I2>).
Where - 'screen'|'term'|{'file',Filename}|{'ip',Port}
If Where is 'screen, trace messages will be printed like this;
[{Tag,Data,Process,Timestamp}...]
Tag - call|return|send|receive
Data - term(). If Tag is
call; the called MFA
send; {DestinationProcess,Message}
receive; Message
return; {CalledMFA, ReturnValue} (Process and Timestamp is not shown)
Process is the registered name, if any, or else the initital call {M,F,A}.
Timestamp is {Hour, Minute, Second, Microsecond}
if Where is 'term', a list of all the messages will be sent to the process
that started the trace.
If Where is {'file',Filename}, trace messages are written to a wrap
file. Filename must be absolute, i.e. start with a "/". In this
case, the Msgs argument will be interpreted as the maximum file size
(in MB). There will be at most 3 wrap files, named Filename0.trc,
Filename1.trc and Filename2.trc.
If Where is {'ip',Port}, trace messages will be sent to that trace port
Target - the Erlang node on which to start the trace
EXAMPLES
redbug:start(3000,3,'receive',prfTarg).
**redbug stopped - 3 msgs**
{'receive',{timeout,#Ref<0.0.0.1649>,tick},prfTarg,{16,47,22,1009}}
{'receive',{<0.175.0>,get_status,{ok,3657,3658}},prfTarg,{16,47,22,1072}}
{'receive',{<0.382.0>,get_status,{ok,37,26}},prfTarg,{16,47,22,1088}}
redbug:start(3000,3,['send','receive'],prfTarg).
**redbug stopped - 3 msgs**
{'receive',{timeout,#Ref<0.0.0.2005>,tick},prfTarg,{16,52,48,1011}}
{send,{{<0.364.0>,get_status},{inet_tcp_dist,do_accept,6}},
prfTarg,
{16,52,48,1068}}
{'receive',{<0.175.0>,get_status,{ok,3820,3821}},prfTarg,{16,52,48,1088}}
redbug:start(3000,3,{erlang,now}).
**redbug stopped - 1 msgs**
{call,{erlang,now,[]},{erlang,apply,2},{16,44,25,176124}}
redbug:start(3000,3,{erlang,now,[return]}).
**redbug stopped - 2 msgs**
{call,{erlang,now,[]},{erlang,apply,2},{16,44,39,773608}}
{return,{erlang,now,0},{1141,746279,773613}}
redbug:start(3000,3,{erlang,now,[return,stack]}).
**redbug stopped - 2 msgs**
{call,{erlang,now,[]},{erlang,apply,2},{16,44,58,386617}}
{shell,eval_loop,3}
{shell,exprs,6}
{return,{erlang,now,0},{1141,746298,386621}}
redbug:start(3000,3,{ets,tab2list,[{inet_db}]}).
(erl@foo)1> ets:tab2list(inet_db).
(erl@foo)2> ets:tab2list(ac_tab).
**redbug stopped - 1 msgs**
{call,{ets,tab2list,[inet_db]},{erlang,apply,2},{16,43,54,301126}}
Jump to Line
Something went wrong with that request. Please try again.