Debugging 如何让Erlang调试器执行条件中断?
给定一个正数N,我的print_even()函数将输出1到N之间的所有偶数:Debugging 如何让Erlang调试器执行条件中断?,debugging,erlang,Debugging,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
-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.
下面是我用于条件中断的代码:
-module(c_test).
-compile(export_all).
c_break(Bindings) ->
case int:get_bindings('Current', Bindings) of
{value, 3} -> true;
_ -> false
end.
c_break(_) ->
true.
我在print_even()中的下一行设置了条件分隔符:
…根据Erlang,这应该是合法的。但无论我做什么,我都无法让我的c_break()函数执行。当Current等于3时,我希望执行在断点处停止,但代码运行到完成,断点被跳过。我甚至试过:
c_break(Bindings) ->
case int:get_bindings('Current', Bindings) of
_ -> true;
end.
但是执行仍然不会在断点处停止
更新:如果我对条件中断使用以下函数,我可以停止执行:
-module(c_test).
-compile(export_all).
c_break(Bindings) ->
case int:get_bindings('Current', Bindings) of
{value, 3} -> true;
_ -> false
end.
c_break(_) ->
true.
如果我将其更改为:
c_break(X) ->
io:format("~w~n", [X]),
true.
…然后再次执行将不会停止。!@$!@$!@!!应该是:
int:get_binding()
^
|
不是:
即使如此,重新编译模块也没有成功地停止执行。为了让事情顺利进行,我必须退出调试器:我关闭了所有调试器窗口,然后发出命令:
82> debugger:stop().
ok
(我找不到关于函数调试器:stop()的任何信息,因此我不知道这是否必要,甚至不知道是否有任何作用。)
然后我重新编译了两个模块:
83> c(my, [debug_info]).
{ok,my}
84> c(c_test).
{ok,c_test}
然后:
…我从弹出窗口中选择了my.erl
,其中my.erl
是包含我要停止执行的函数的模块
然后,在监视器窗口仍处于活动状态的情况下,我选择了菜单项:
Break>Conditional Break
…我填写了信息。您还可以双击监视器窗口中显示的模块名称,然后使用打开的查看模块窗口设置断点。View Module窗口显示您的源代码,并且该窗口还有一个中断菜单项,允许您设置各种类型的断点。在“查看模块”窗口中,可以使用快捷方式创建行断点,即常规断点:可以通过双击代码中的行来设置断点
最后:
86> my:print_even(10).
(Current = 1)
(Current = 2)
Number: 2
(Current = 3)
万岁
然后我双击了Monitor窗口中列出的进程,打开了Attach进程窗口。“附加进程”窗口显示代码中停止执行的位置,并提供逐步执行代码的方法
回到监视器窗口中,如果选中“中断时<代码>复选框”,则当执行在断点处停止时,将自动打开“附加进程”窗口。据我所知,每次运行代码时都需要打开一个新的附加进程窗口
顺便说一下,模块名
c_test
和函数名c_break()
可以是任何名称。它们的名称并不重要,例如,我将模块名称更改为条件中断
,将函数名称更改为break1()
,我建议这样做,因为它允许您在不处理调试器的情况下快速定位问题。@SteveVinoski,好的,谢谢。你能告诉我为什么在我上面发布的最后一个代码示例中无法打印绑定(变量X)吗?不幸的是,不,我不知道答案。我从不使用任何Erlang调试器,只使用跟踪。
Module > Interpret
Break>Conditional Break
86> my:print_even(10).
(Current = 1)
(Current = 2)
Number: 2
(Current = 3)