gpt4 book ai didi

erlang - erlang :get_stacktrace/0 for getting information on the caller of a function? 的替代品

转载 作者:行者123 更新时间:2023-12-02 03:16:39 24 4
gpt4 key购买 nike

我正在研究一个从我们现有代码库中相对热门的代码路径调用的函数。该函数做的第一件事是在 try catch block 中调用 erlang:get_stacktrace/0 以便我们可以获得堆栈跟踪:

the_function() ->  
[_|Trace] = try error(x) of
_ -> error(impossible)
catch
error:x -> erlang:get_stacktrace()
end,
...

我们保留堆栈跟踪,以便我们了解有关函数调用者的信息。我读过 erlang:get_stacktrace/0 并不总是一个便宜的调用函数 ( http://erlang.org/pipermail/erlang-questions/2013-November/075928.html )。由于这是一个热代码路径,我想用更简单的东西替换它。有没有另一种方法可以获取有关调用函数的信息,例如模块和函数名称、行号等...而无需调用 get_stacktrace

最佳答案

如果您需要知道从哪里调用您,那么 get_statrace 可能还不够,因为调用者可能已经在堆栈之外进行了优化。

相反,我会考虑这样的事情:

the_function(Normal, Args, {Module, Line}) ->
try something(Normal, Args)
catch error:x -> print_error(Module, Line).

-define(?the_function(Normal, Args), the_function(Normal, Args, {?MODULE, ?LINE})).

现在,您将对 the_function 的所有调用更改为 ?the_function,并在编译时为您添加第三个参数。

您可以使用解析转换来完成更复杂的版本。

关于erlang - erlang :get_stacktrace/0 for getting information on the caller of a function? 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com