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

标签 erlang

我正在研究一个从我们现有代码库中相对热门的代码路径调用的函数。该函数做的第一件事是在 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/

相关文章:

erlang - 如何限制消息队列或模拟它?

erlang - 模式匹配 Elixir 记录 Aganist 结构

timer - erlang 中的高分辨率计时器

Erlang 模式匹配 bool 示例

erlang - 我的 gen_server 会成为瓶颈吗?

erlang - 守卫没有捕获正确的数据

security - 如何加密 Erlang rpc 调用(和 Mnesia 复制)和其他流量?

erlang - 为什么我在 Erlang 中热加载代码后没有得到任何终端输出?

erlang - 使用暗模式修复 OSX 上的 Erlang 观察器

erlang - 单击按钮时如何获取?