当我编译以下模块时:
-module(x).
-export([inp/0]).
f(X) ->
g(X).
g(X) ->
error(X).
inp() ->
f(123).
然后计算x:inp()
,得到以下输出:
[{x,g,1,[{file,"x.erl"},{line,8}]},
{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,689}]},
{erl_eval,try_clauses,8,[{file,"erl_eval.erl"},{line,919}]},
{shell,exprs,7,[{file,"shell.erl"},{line,686}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]
对f
和inp
的调用去了哪里?这种行为使得在我的案例中跟踪错误的原因变得非常困难,我如何获得完整的堆栈跟踪?
我正在使用OTP24
1条答案
按热度按时间egmofgnx1#
这是因为Erlang的编译器进行了优化。编译器推断,在这个特定的例子中,函数
f()
和inp()
只用于将一个数字传递给函数g()
,它们不能用于其他任何事情,甚至理论上也不能。因此编译器"优化掉它们",实际上只编译函数g()
。