Les étapes de base du traçage des appels de fonction se font sur un nœud non vivant :
> dbg:start(). % start dbg
> dbg:tracer(). % start a simple tracer process
> dbg:tp(Module, Function, Arity, []). % specify MFA you are interested in
> dbg:p(all, c). % trace calls (c) of that MFA for all processes.
... trace here
> dbg:stop_clear(). % stop tracer and clear effect of tp and p calls.
Vous pouvez tracer pour plusieurs fonctions en même temps. Ajoutez des fonctions en appelant tp
pour chaque fonction. Si vous souhaitez effectuer un suivi pour les fonctions non exportées, vous devez appeler tpl
. Pour supprimer des fonctions, appelez ctp
o ctpl
de manière similaire. Certains appels généraux de tp sont :
> dbg:tpl(Module, '_', []). % all calls in Module
> dbg:tpl(Module, Function, '_', []). % all calls to Module:Function with any arity.
> dbg:tpl(Module, Function, Arity, []). % all calls to Module:Function/Arity.
> dbg:tpl(M, F, A, [{'_', [], [{return_trace}]}]). % same as before, but also show return value.
Le dernier argument est une spécification de correspondance. Vous pouvez jouer avec cela en utilisant dbg:fun2ms
.
Vous pouvez sélectionner les processus à suivre avec l'appel à p(). Les éléments sont décrits sous erlang:trace. Certains appels sont :
> dbg:p(all, c). % trace calls to selected functions by all functions
> dbg:p(new, c). % trace calls by processes spawned from now on
> dbg:p(Pid, c). % trace calls by given process
> dbg:p(Pid, [c, m]). % trace calls and messages of a given process
Je suppose que vous n'aurez jamais besoin d'appeler directement erlang:trace
comme dbg
fait à peu près tout pour vous.
Une règle d'or pour un nœud vivant est de ne générer qu'une quantité limitée de sortie de trace vers le shell, ce qui vous permet de taper dans dbg:stop_clear().
. :)
J'utilise souvent un traceur qui s'arrête automatiquement après un certain nombre d'événements. Par exemple :
dbg:tracer(process, {fun (_,100) -> dbg:stop_clear();
(Msg, N) -> io:format("~p~n", [Msg]), N+1 end, 0
}).
Si vous cherchez à déboguer sur des nœuds distants (ou plusieurs nœuds), recherchez pan
, eper
, inviso
o onviso
.
0 votes
github.com/massemanet/redbug