стек вызовов erlang

я должен отладить некоторый модуль во внешней системе, модуль имеет нечто государственной функции () - как я могу знать место (имя модуля и имя функции), от которого назвали нечто () данный модуль? Я имею в виду стопку вызовов.

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
9
задан vinnitu 12 February 2010 в 16:32
поделиться

3 ответа

io:format("~s~n", [element(2, process_info(self(), backtrace))]).

self() может быть заменен на любой другой pid (rpc:pinfo должен работать даже с удаленными proc). Это поможет, если вы даже не можете изменить источник или луч.

1
ответ дан 4 December 2019 в 08:51
поделиться

Вот простой трюк:

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 .

3
ответ дан 4 December 2019 в 08:51
поделиться

Вот простой трюк:

Trace = try throw(42) catch 42 -> erlang:get_stacktrace() end,
erlang:display(Trace)
19
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: