Это может сработать:
where_am_i() ->
try throw(a)
catch throw:a ->
erlang:get_stacktrace()
end.
За исключением того, что он не работает для оконечных вызовов. Например, с учетом этих двух функций:
foo() ->
where_am_i().
bar() ->
X = where_am_i(),
{ok, X}.
Я получаю эти результаты:
4> foo:foo().
[{foo,where_am_i,0},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_exprs,6},
{shell,eval_loop,3}]
5> foo:bar().
{ok,[{foo,where_am_i,0},
{foo,bar,0},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_exprs,6},
{shell,eval_loop,3}]}
То есть я вижу только bar
, так как кадр вызова foo
уже оставлен при вызове where_am_i
.