Отладка в Erlang, trace/dbg
-
Upload
yuri-zhloba -
Category
Technology
-
view
179 -
download
11
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
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
Упор на отладку функций
трассировка сообщений покане поддерживается
Вопросы?