Основные шаги трассировки для вызовов функций находятся на неживом узле:
> 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.
Вы можете отслеживать несколько функций одновременно. Добавьте функции, вызвав tp
для каждой функции. Если вы хотите отследить неэкспортированные функции, вам нужно вызвать tpl
. Чтобы удалить функции, вызовите ctp
или ctpl
аналогичным образом. Некоторые общие звонки по телефону:
> 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.
Последний аргумент является спецификацией соответствия. Вы можете поиграть с этим, используя dbg:fun2ms
.
Вы можете выбрать процессы для отслеживания с помощью вызова p (). Элементы описаны под erlang: trace. Некоторые звонки:
> 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
Полагаю, вам никогда не понадобится напрямую звонить erlang:trace
, так как dbg
сделает для вас почти все.
Золотое правило для живого узла - генерировать только объем вывода трассировки в оболочку, что позволяет вводить dbg:stop_clear().
. :)
Я часто использую трассировщик, который автоматически останавливается после ряда событий. Например:
dbg:tracer(process, {fun (_,100) -> dbg:stop_clear();
(Msg, N) -> io:format("~p~n", [Msg]), N+1 end, 0
}).
Если вы ищете отладку на удаленных узлах (или нескольких узлах), найдите pan
, eper
, inviso
или onviso
.