【问题标题】:Elixir - Trace function callElixir - 跟踪函数调用
【发布时间】:2018-10-26 03:11:51
【问题描述】:

Elixir 中是否有类似于 lisp 中的 trace 宏的东西,它显示函数调用的输入和返回值。取自Common Lisp HyperSpec网站:

 (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1)))))
=>  FACT
 (trace fact)
=>  (FACT)
;; Of course, the format of traced output is implementation-dependent.
 (fact 3)
>>  1 Enter FACT 3
>>  | 2 Enter FACT 2
>>  |   3 Enter FACT 1
>>  |   | 4 Enter FACT 0
>>  |   | 4 Exit FACT 1
>>  |   3 Exit FACT 1
>>  | 2 Exit FACT 2
>>  1 Exit FACT 6
=>  6

【问题讨论】:

    标签: elixir


    【解决方案1】:

    查看 Erlang 的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2019-06-05
      • 2010-09-26
      相关资源
      最近更新 更多