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

62
Отладка в Erlang trace/dbg Юра Жлоба для Belarus Erlang User Group

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

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

Отладка в Erlang

trace/dbg

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

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

io:format lager

debugger

erlang:trace trace_pattern

dbg

sys recon_trace

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

Erlang ProgrammingFrancesco Cesarini

17-я глава

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

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

erlang:trace

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

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

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

erlang:trace

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

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

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

erlang:trace

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

true / false

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

erlang:trace

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

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

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

erlang:trace

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

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

erlang:trace

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

{trace, Pid, 'receive', Msg}

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

erlang:trace

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

{trace, Pid, send, Msg, To}

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

erlang:trace

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

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

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

erlang:trace

tracer process

[{tracer, Pid}]

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

erlang:trace_pattern

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

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

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

erlang:trace_pattern

trace

процессы

trace_pattern

функции

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

erlang:trace_pattern

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

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

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

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

erlang:trace_pattern

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

true / falserestart, pause

match specification

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

erlang:trace_pattern

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

[local, global,call_count, call_time]

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

erlang:trace_pattern

global:my_module:my_func(Arg)

local:my_func(Arg)

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

dbg

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

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

dbg

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

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

dbg

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

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

dbg

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

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

атомы: existing, new, all

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

dbg

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

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

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

dbg

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

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

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

dbg

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

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

dbg

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

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

apply(Mod, Fun, Args)

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

dbg

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

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

dbg

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

tp – trace_pattern, globaltpl – trace_pattern, local

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

dbg

dbg:tp(Module, MatchSpec)

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

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

dbg

dbg:tp(Module, Function, MatchSpec)

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

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

dbg

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

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

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

dbg

dbg:ctp dbg:ctpg dbg:ctpl

cancel trace_patterncancel trace_pattern, globalcancel trace_pattern, local

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

dbg

dbg:ctp dbg:ctpg dbg:ctpl

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

сложно все :)

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

dbg

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

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

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

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

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

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

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

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

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

в файл

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

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

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

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

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

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

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

в файл

PortFun = dbg:trace_port(file, FileOptions),

dbg:tracer(port, PortFun)

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

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

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

dbg:tracer(port, PortFun)

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

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

Match Specification

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

erlang:trace_pattern, ets:select

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

Match Specification

dbg:fun2ms(LiteralFun) -> MatchSpec

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

Match Specification

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

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

Match Specification

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

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

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

Match Specification

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

dbg:tp(my_module, my_function, MatchSpec)

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

Match Specification

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

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

Match Specification

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

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

Match Specification

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

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

Match Specification

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

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

Match Specification

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

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

Match Specification

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

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

Match Specification

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

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

sys

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

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

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

sys

sys:trace(Process, true)

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

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

sys

sys:statistics(Process, true)

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

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

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

sys

sys:get_state(Name) -> State

sys:replace_state(Name, StateFun) -> NewState

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

sys

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

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

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

recon_trace

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

проект recon

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

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

recon_trace

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

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

recon_trace

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

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

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

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

recon_trace

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

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

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

recon_trace

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

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

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

Вопросы?