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,"erl_eval.erl"},689}]},try_clauses,8,919}]},{shell,exprs,7,"shell.erl"},686}]},eval_exprs,642}]},eval_loop,3,627}]}]

finp调用去了哪里?这种行为使得在我的案例中跟踪错误原因变得更加困难,我如何获得完整的堆栈跟踪?


我正在使用 OTP24

解决方法

这是因为 Erlang 的编译器优化。编译器推断,在这种特定情况下,函数 f()inp() 仅用于将数字传递给函数 g(),它们不能用于任何事情否则,甚至理论上都不是。因此编译器“将它们优化掉”并且事实上只编译函数 g()