它看起来像在 ruby-debug 的源代码中,调用总是debugger
会在它被命中时停止执行。因此,一种解决方案是按照 Mori 在他的“临时”解决方案中所建议的那样做,围绕对调试器的调用设置一个条件,您可以在调试器会话本身内部进行调整,这样您就可以避免调用. 这可能是最简洁的解决方案,除非您对所涉及的代码有一些强烈的令人讨厌的纯度问题,否则我会这样做。debugger
如果您真的只想在没有一些外部条件的情况下并在调试器会话本身内执行此操作,那么这是可能的。您需要做的是在代码本身中设置一个断点,然后您可以在触发时在调试器中删除该断点:
require 'rubygems'
require 'ruby-debug'
Debugger.start
Debugger.add_breakpoint(__FILE__, __LINE__ + 2)
while true do
puts "Hi"
puts "mom"
end
Debugger.stop
这会产生这种交互:
Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) c
Hi
mom
Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) c
Hi
mom
Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) info b
Num Enb What
1 y at ./debug_test.rb:10
breakpoint already hit 3 times
(rdb:1) del 1
(rdb:1) c
Hi
mom
Hi
mom
Hi
mom
...等等。
这样,您在代码中设置断点,然后在完成后将其删除。请注意,任何时候Debugger.add_breakpoint
调用该行时,它都会重新设置断点,这就是为什么它位于循环之外并向下指向 2 行的原因。这种技术可以很容易地提取为require
仅在加载服务器时设置断点的脚本 - 哎呀,你可以编写一个完整的框架类来控制调试器模块,但是你想要。当然,如果您走到这一步,我只会创建一个单例类来帮助您实现 Mori 的临时解决方案并调用或不调用调试器语句。