Erlang中的堆栈跟踪中缺少条目



编译以下模块时:

-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}]}]

finp的呼叫去了哪里?这种行为大大增加了跟踪错误原因的难度。在我的情况下,如何才能获得完整的堆栈?


我正在使用OTP24

这是因为Erlang的编译器优化。编译器推断,在这种特定情况下,函数f()inp()仅用于将数字传递给函数g(),它们不能用于其他任何事情,甚至在理论上也不能。所以编译器";优化它们";并且事实上仅编译函数CCD_ 7。

最新更新