【问题标题】:Missing entries in the stack trace in ErlangErlang 中的堆栈跟踪中缺少条目
【发布时间】:2021-08-16 17:18:27
【问题描述】:

当我编译以下模块时:

-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

【问题讨论】:

  • this 会回答您的问题吗?这是一个关于 Elixir 的问题,但答案也适用于 Erlang。

标签: erlang stack-trace inlining


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多