Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

dbg playground

articles/dbg-playground.livemd

dbg playground

Intro

Elixir 에서 프로세스, 함수를 트레이싱하는 가장 좋은 방법은 recon 모듈을 사용하는 것이다. 하지만 recon 을 사용하기 어려운 경우도 있다.

  • recon 을 사용하지 않으면서, git 으로 관리되는 mix project. (Mix.install 사용 불가)

이런 경우를 대비해서, erlang 에 기본적으로 내장되어 있는 dbg 모듈의 활용방법을 익혀두면 유용할 것 같다는 생각이 들었다.

https://kaiwern.com/posts/2020/11/02/debugging-with-tracing-in-elixir 포스트의 dbg 코드를 livebook 에 가져왔는데, 몆 가지 문제가 있다.

:dbg.tracer(:process, {fn _, 5 -> :dbg.stop_clear()
                        msg, n -> IO.inspect(msg); n+1 end, 0})

위 코드로 tracer 프로세스를 실행하면, livebook 에서 flush_widgets timeout 에러가 발생한다.

아무런 옵션 없이 :dbg.tracer 를 실행하면, 트레이스된 메시지를 확인할 수 있는 방법이 없어진다.

관련해서 livebook 의 코드를 살펴보는 것이 좋을 것 같다.

evaluator = self()
Process.whereis(Livebook.Evaluator)
# :dbg.tracer()
:dbg.tracer(
  :process,
  {fn msg, n ->
     IO.inspect(msg)
     n + 1
   end, 0}
)
:dbg.tpl(Enum, :map, [])
:dbg.p(:all, :c)
Enum.map([1, 2, 3, 4], &(&1 + 1))
:dbg.stop_clear()

Section