Посмотрите на модуль Эрланга dbg
(см. https://stackoverflow.com/a/1954980/436853, чтобы узнать, как мне поступить, когда мне нужно использовать этот модуль). Преобразовать его в вызовы в стиле Elixir просто:
iex(1)> :dbg.start()
{:ok, #PID<0.91.0>}
iex(2)> :dbg.tracer()
{:ok, #PID<0.91.0>}
iex(3)> :dbg.p(:all, :c)
{:ok, [{:matched, :nonode@nohost, 52}]}
iex(4)> :dbg.tp(IO, :puts, 1, [{:"_", [], [{:return_trace}]}])
{:ok, [{:matched, :nonode@nohost, 1}, {:saved, 1}]}
iex(5)> IO.puts("Hello!")
Hello!
(<0.89.0>) call 'Elixir.IO':puts(<<"Hello!">>)
(<0.89.0>) returned from 'Elixir.IO':puts/1 -> ok
:ok