在Ruby on Rails(4.0.2)的应用程序中,我们总是遇到这个问题。我从来不清楚为什么应用程序有时不会在调试器语句处停止。
在某些情况下,我们发现了一些常量行为,例如:在测试中,如果语句放在测试块的末尾,它就永远不会停止:
describe '#some_method' do
it 'should do something as in the requirements etc' do
model_x = FactoryGirl.create(:model_x)
model_x.should be_valid
# ...more code
model_x.should be_valid
debugger
end
end
要使调试器在语句处停止,我们必须添加p "foo"
在它之后。
在其他一些神秘的案例中,它并没有停止,但如果您在之前和之后添加打印件,它就会停止。
调试延迟作业时,您可能需要调试器并添加一些打印件才能停止。
我无法找到调试器有时会跳过调试器语句的确定性原因。
有人可以列出这种行为的原因吗?
Obs:我现在正在使用byebug,但我知道普通的调试器也有这种行为。
Obs2:来自我的 Gemfile.lock :
byebug (2.4.0)
columnize (~> 0.3.6)
debugger-linecache (~> 1.2.0)
...
debugger (1.6.3)
columnize (>= 0.3.1)
debugger-linecache (~> 1.2.0)
debugger-ruby_core_source (~> 1.2.4)
debugger-linecache (1.2.0)
debugger-ruby_core_source (1.2.4)
答案 0 :(得分:3)
这是调试器gem中的一个已知问题,请参阅here(项目符号第3点)。
您似乎对为什么不感兴趣。以下是解释:
调试器正在观察ruby提供的一些事件,告诉调试器何时停止。在这种情况下,调试器跟踪我们称为每行执行一次触发的line event
,因此在方法的最后一行的情况下,调试器将在下一行事件中停止,这实际上发生在外部正在调试的方法。
然而,在byebug中,我还跟踪我们称之为return events
的内容,每次方法完成时都会调用它们。这就是为什么我能够在方法实际完成之前停止执行的原因。
希望这有帮助。