Erlang中堆栈跟踪缺少条目

3
当我编译以下模块时:
-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。


这个回答是否解决了您的问题?虽然这是有关Elixir的问题,但是该回答也适用于Erlang。 - legoscia
1个回答

3
这是由于 Erlang 的编译器优化所致。编译器推断出,在特定情况下,函数 f()inp() 仅用于向函数 g() 传递一个数字,并且它们不可能用于任何其他用途,甚至从理论上讲都不行。因此,编译器将它们“优化掉”,实际上只编译函数 g()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接