Как вы получаете отладчик Erlang для выполнения условного перерыва?

Учитывая положительное число N, моя функция print_even() выводит все четные числа между 1 и N:

-module(my).
-compile(export_all).
print_even(N) when N>0 -> even_helper(1, N).
even_helper(Current, N) when Current =< N ->
 io:format("(Current = ~w)~n", [Current]),
 case Current rem 2 of
 0 -> io:format("Number: ~p~n", [Current]);
 _ -> do_nothing
 end,
 even_helper(Current+1, N);
even_helper(Current, N) when Current > N ->
 ok.

Вот пример вывода:

28> my:print_even(10).
(Current = 1)
(Current = 2)
Number: 2
(Current = 3)
(Current = 4)
Number: 4
(Current = 5)
(Current = 6)
Number: 6
(Current = 7)
(Current = 8)
Number: 8
(Current = 9)
(Current = 10)
Number: 10
ok

Ниже приведен код, который я использую для условного разрыва:

-module(c_test).
-compile(export_all).
c_break(Bindings) ->
 case int:get_bindings('Current', Bindings) of
 {value, 3} -> true;
 _ -> false
 end.

Я установил условный разрыв в следующей строке в print_even():

case Current rem 2 of

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

c_break(Bindings) ->
 case int:get_bindings('Current', Bindings) of
 _ -> true;
 end.

Но выполнение остановки не остановится в точке останова.

Обновление: Я могу заставить выполнение остановиться, если я использую следующую функцию для моего условного разрыва:

c_break(_) ->
 true.

Если я изменил это на:

c_break(X) ->
 io:format("~w~n", [X]),
 true.

..., то снова выполнение не остановится.

1 ответ

! @# $@# $@!! Это должно быть:

int:get_binding()
 ^
 |

не

int:get_bindings() 
 ^
 |

Даже тогда перекомпиляции модуля не удалось остановить выполнение. Чтобы заставить работать, мне пришлось выйти из отладчика: я закрыл все окна отладчика, затем я выписал команду:

82> debugger:stop().
ok

(Я не могу найти никакой информации для функции отладчика: stop(), поэтому я не знаю, нужно ли это или даже что-то делать.)

Затем я перекомпилировал оба модуля:

83> c(my, [debug_info]).
{ok,my}
84> c(c_test).
{ok,c_test}

Тогда:

85> debugger:start().
{ok,<0.305.0>}

отладчик: start() запускает Monitor window, а при активном окне монитора я выбрал пункт меню:

Module > Interpret

... и я выбрал my.erl из всплывающего окна, где my.erl - это модуль, содержащий функцию, в которой я хочу остановить выполнение.

Затем, когда окно Monitor все еще активно, я выбрал пункт меню:

Break>Conditional Break

... и я заполнил эту информацию. Вы также можете дважды щелкнуть имя своего модуля, отображаемое в окне "Монитор" , а затем использовать View Module window, который открывается для установки контрольных точек. Окно "Вид модуля" отображает исходный код, а окно также имеет пункт меню "Разрыв", который позволяет вам устанавливать различные типы точек останова. В окне "Вид модуля" вы можете использовать ярлык для создания контрольной точки линии, т.е. Регулярную точку останова: вы можете установить точку останова, дважды щелкнув строку в коде.

Наконец:

86> my:print_even(10). 
(Current = 1)
(Current = 2)
Number: 2
(Current = 3)

Ура!

Затем я дважды щелкнул по процессу, указанному в окне "Монитор" , и открылось окно "Процесс присоединения". Окно "Присоединить процесс" показывает, где выполнение остановлено в вашем коде, и оно предоставляет вам средства для прохождения кода.

Вернитесь в окно "Монитор" , если вы установите флажок On Break, тогда окно Attach Process откроется автоматически, когда выполнение остановится в точке останова. Насколько я могу судить, вам нужно открыть новое окно Attach Process при каждом запуске вашего кода.

Кстати, имя модуля c_test и имя функции c_break() могут быть любым именем. Их имена не важны, например, я изменил имя модуля на conditional_breaks и имя функции на break1().

licensed under cc by-sa 3.0 with attribution.