SlideShare a Scribd company logo
1 of 62
Отладка в 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 
отладка 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 
Упор на отладку функций 
трассировка сообщений пока 
не поддерживается
Вопросы?

More Related Content

What's hot

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
Positive Hack Days
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
ygoltsev
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 

What's hot (20)

Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav
 
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в Windows
 
Haskell
HaskellHaskell
Haskell
 
ITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd - Метапрограммирование
ITCrowd - Метапрограммирование
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 

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

GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камни
Yehor Nazarkin
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
BlackFan
 

Similar to Отладка в Erlang, trace/dbg (20)

Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScript
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камни
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
course js day 2
course js day 2course js day 2
course js day 2
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменных
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Erlang data operation caveats
Erlang data operation caveatsErlang data operation caveats
Erlang data operation caveats
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Scala on android
Scala on androidScala on android
Scala on android
 
XML Magic
XML MagicXML Magic
XML Magic
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 

More from Yuri Zhloba

Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
Yuri Zhloba
 
Все, что вы хотели знать о Rebar, но ленились прочитать
Все, что вы хотели знать о Rebar, но ленились прочитатьВсе, что вы хотели знать о Rebar, но ленились прочитать
Все, что вы хотели знать о Rebar, но ленились прочитать
Yuri Zhloba
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
Yuri Zhloba
 

More from Yuri Zhloba (6)

Erlang killer features
Erlang killer featuresErlang killer features
Erlang killer features
 
Gen server
Gen serverGen server
Gen server
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
 
Все, что вы хотели знать о Rebar, но ленились прочитать
Все, что вы хотели знать о Rebar, но ленились прочитатьВсе, что вы хотели знать о Rebar, но ленились прочитать
Все, что вы хотели знать о Rebar, но ленились прочитать
 
Erlang ruby
Erlang rubyErlang ruby
Erlang ruby
 
Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 

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