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
Программирование LinuxAnthony Shoumikhin
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWPositive Hack Days
 
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 FedorFedor Lavrentyev
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)ygoltsev
 
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" Fwdays
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQAFest
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 
Использование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsИспользование cygwin для автоматизации процессов тестирования в Windows
Использование cygwin для автоматизации процессов тестирования в WindowsSQALab
 
Haskell
HaskellHaskell
HaskellDevDay
 
ITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd Almaty
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
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
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 

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

Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptEugene Tataurov
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниYehor Nazarkin
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхDmitry Protopopov
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2PyNSK
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Erlang data operation caveats
Erlang data operation caveatsErlang data operation caveats
Erlang data operation caveatsIlya Averyanov
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)Ontico
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 

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

Erlang killer features
Erlang killer featuresErlang killer features
Erlang killer featuresYuri Zhloba
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlangYuri 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