я должен отладить некоторый модуль во внешней системе, модуль имеет нечто государственной функции () - как я могу знать место (имя модуля и имя функции), от которого назвали нечто () данный модуль? Я имею в виду стопку вызовов.
PS: Я не могу остановить систему, вся работа, я могу сделать перезагрузкой этот модуль (но с som информацией об отладке)
-module(given).
-export(foo/0).
foo() ->
%% here is my debug - and i need here(!) known about unknown_module:unknown_foo!
ok.
---
-module(unknown_module).
..
unknown_foo() ->
given:foo(). %% see above
io:format("~s~n", [element(2, process_info(self(), backtrace))]).
self() может быть заменен на любой другой pid (rpc:pinfo должен работать даже с удаленными proc). Это поможет, если вы даже не можете изменить источник или луч.
Вот простой трюк:
Trace = try throw(42) catch 42 -> erlang:get_stacktrace() end,
erlang:display(Trace)
-121--3255158- Зависит от типа программы, которую вы пишете.
Консольное приложение может вызвать функцию «Сон». Приложение графического интерфейса пользователя, вероятно, не хочет делать это, так как все меню и виджеты будут нечувствительны, и приложение не будет перерисовываться в течение этого периода. Вместо этого необходимо настроить таймер с обратным вызовом по истечении этого срока.
-121--1720603-Это может работать:
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}]}
То есть я могу видеть только строку
, так как фрейм вызова foo
был оставлен уже при вызове где _ am _ i
.
Вот простой трюк:
Trace = try throw(42) catch 42 -> erlang:get_stacktrace() end,
erlang:display(Trace)