ݺߣ

ݺߣShare a Scribd company logo
Отладка в Erlang 
trace/dbg 
Юра Жлоба для Belarus Erlang User Group
io:format lager 
debugger 
erlang:trace trace_pattern 
dbg 
sys recon_trace
Erlang Programming 
Francesco Cesarini 
17-я глава 
Stuff Goes Bad. Erlang in Anger 
Fred Hebert 
9-я глава
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 / false 
restart, 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, global 
tpl – 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_pattern 
cancel trace_pattern, global 
cancel 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 -> 
true 
end
Match Specification 
fun([_, {error, _}]) -> 
return_trace(), 
true 
end
Match Specification 
fun([_, {error, _}]) -> 
exception_trace(), 
true 
end
Match Specification 
fun([_, {error, Msg}]) -> 
message(Msg), 
true 
end
Match Specification 
fun([_, {error, _}]) -> 
message(caller()), 
true 
end
Match Specification 
fun([_, {error, _}]) -> 
message(process_dump()), 
true 
end
Match Specification 
fun([_, {error, _}]) -> 
message(self()), 
true 
end
sys 
http://www.erlang.org/doc/man/sys.html 
отладка ձ-процессов
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 
Упор на отладку функций 
трассировка сообщений пока 
не поддерживается
Вопросы?

More Related Content

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