Отладка в Erlang, trace/dbg

Post on 12-Jul-2015

181 views 11 download

Transcript of Отладка в Erlang, trace/dbg

Отладка в Erlang

trace/dbg

Юра Жлоба для Belarus Erlang User Group

io:format lager

debugger

erlang:trace trace_pattern

dbg

sys recon_trace

Erlang ProgrammingFrancesco Cesarini

17-я глава

Stuff Goes Bad. Erlang in AngerFred Hebert9-я глава

erlang:trace

erlang:trace(PidSpec, How, FlagList) -> integer()

http://www.erlang.org/doc/man/erlang.html

erlang:trace

erlang:trace(PidSpec , How, FlagList) -> integer()

Pid процессаатомы: existing, new, all

erlang:trace

erlang:trace(PidSpec, How, FlagList) -> integer()

true / false

erlang:trace

erlang:trace(PidSpec, How, FlagList) -> integer()

[send, 'receive', procs, call, running,garbage_collection, ...]

erlang:trace

{trace, Pid, EventTag, Data1 [,Data2]}

erlang:trace

{trace, Pid, EventTag, Data1 [,Data2]}

{trace, Pid, 'receive', Msg}

erlang:trace

{trace, Pid, EventTag, Data1 [,Data2]}

{trace, Pid, send, Msg, To}

erlang:trace

{trace, Pid, EventTag, Data1 [,Data2]}

{trace, Pid, call, {M, F, Args}}

erlang:trace

tracer process

[{tracer, Pid}]

erlang:trace_pattern

erlang:trace_pattern(MFA, MatchSpec, FlagList) -> integer()

http://www.erlang.org/doc/man/erlang.html

erlang:trace_pattern

trace

процессы

trace_pattern

функции

erlang:trace_pattern

erlang:trace_pattern(MFA, MatchSpec, FlagList) -> integer()

{my_mod, my_fun, 2}{my_mod, my_fun, '_'}

{my_mod, '_', '_'}{'_', '_', '_'}

erlang:trace_pattern

erlang:trace_pattern(MFA, MatchSpec , FlagList) -> integer()

true / falserestart, pause

match specification

erlang:trace_pattern

erlang:trace_pattern(MFA, MatchSpec, FlagList) -> integer()

[local, global,call_count, call_time]

erlang:trace_pattern

global:my_module:my_func(Arg)

local:my_func(Arg)

dbg

http://www.erlang.org/doc/man/dbg.html

dbg

dbg:p/1, dbg:p/2, dbg:c/3, dbg:c/4,dbg:tp/2, dbg:tp/3, ...

dbg

dbg:p(PidSpec, FlagLists) -> {ok, MatchDesc} | {error, term()}

dbg

dbg:p(PidSpec , FlagLists) -> {ok, MatchDesc} | {error, term()}

Pid процесса ({N, N, N}, "<N.N.N>")имя, под которым процесс зарегистрирован

атомы: existing, new, all

dbg

dbg:p(PidSpec, FlagLists ) -> {ok, MatchDesc} | {error, term()}

[s (send), r (received), m (send + receive),p (procs), c (call)]

dbg

dbg:p(“<0.55.0>”, [m])

Pid = list_to_pid(“<0.55.0>”),erlang:trace(Pid, true, [send, 'receive'])

dbg

dbg:c (Mod, Fun, Args, FlagList)

dbg

dbg:c (Mod, Fun, Args, FlagList)

erlang:trace_pattern({Mod, Fun, Args}, true, FlagList),

apply(Mod, Fun, Args)

dbg

dbg:tp/2,3,4, dbg:tpl/2,3,4

dbg

dbg:tp/2,3,4, dbg:tpl/2,3,4

tp – trace_pattern, globaltpl – trace_pattern, local

dbg

dbg:tp(Module, MatchSpec)

erlang:trace_pattern({Module, '_', '_'}, MatchSpec, [])

dbg

dbg:tp(Module, Function, MatchSpec)

erlang:trace_pattern({Module, Function, '_'}, MatchSpec, [])

dbg

dbg:tp(Module, Function, Arity, MatchSpec)

erlang:trace_pattern({Module, Function, Arity}, MatchSpec, [])

dbg

dbg:ctp dbg:ctpg dbg:ctpl

cancel trace_patterncancel trace_pattern, globalcancel trace_pattern, local

dbg

dbg:ctp dbg:ctpg dbg:ctpl

нужно совпасть по аргументами по global/local

сложно все :)

dbg

dbg:stopотменяет trace

dbg:stop_cleanотменяет trace и trace_pattern

Перенаправление трассировки

По умолчанию target processформатирует сообщения

и выводит на консоль

Перенаправление трассировки

в кастомную функцию

в файл

в сокет, на другую ноду

Перенаправление трассировки

в кастомную функцию

dbg:tracer(process , {HandlerFun, Data})

Перенаправление трассировки

в файл

PortFun = dbg:trace_port(file, FileOptions),

dbg:tracer(port, PortFun)

Перенаправление трассировкив сокет, на другую ноду

PortFun = dbg:trace_port(ip, {Port, QueueSize}),

dbg:tracer(port, PortFun)

dbg:trace_client(ip, {Host, Port}, {HandlerFun, Data})

Match Specification

DSL для матчинга

erlang:trace_pattern, ets:select

Match Specification

dbg:fun2ms(LiteralFun) -> MatchSpec

Match Specification

fun([_, {error, _}]) -> true end

Match Specification

dbg:fun2ms(fun([_, {error, _}]) -> true end)

[{['_',{error,'_'}],[],[true]}]

Match Specification

MatchSpec = dbg:fun2ms(fun([_, {error, _}]) -> true end),

dbg:tp(my_module, my_function, MatchSpec)

Match Specification

fun([Counter, {error, _}]) when Counter > 10 -> trueend

Match Specification

fun([_, {error, _}]) -> return_trace(), trueend

Match Specification

fun([_, {error, _}]) -> exception_trace(), trueend

Match Specification

fun([_, {error, Msg}]) -> message(Msg), trueend

Match Specification

fun([_, {error, _}]) -> message(caller()), trueend

Match Specification

fun([_, {error, _}]) -> message(process_dump()), trueend

Match Specification

fun([_, {error, _}]) -> message(self()), trueend

sys

http://www.erlang.org/doc/man/sys.html

отладка OTP-процессов

sys

sys:trace(Process, true)

call, cast, изменения в state

sys

sys:statistics(Process, true)

количество сообщений,редукций планировщика,

время старта процесса и текущее

sys

sys:get_state(Name) -> State

sys:replace_state(Name, StateFun) -> NewState

sys

Вывод в консоль или в файл

Для локальной отладки,не для отладки на продакшене

recon_trace

Фред Хебертлучший писатель про Erlang :)

проект recon

мониторинг, диагностикаи отладка на продакшене

recon_trace

http://ferd.github.io/recon/recon_trace.html

recon_trace

безопасность отладки

лимит обрабатываемых событий

остановка трассировки при отключении консоли

recon_trace

Еще лаконичнее, чем dbg

не нужно явно задавать множествопроцессов и множество функций

recon_trace

Упор на отладку функций

трассировка сообщений покане поддерживается

Вопросы?