Похоже, что в исходном коде ruby-debug вызов debugger
будет всегда останавливать выполнение всякий раз, когда он срабатывает. Таким образом, одно из решений состоит в том, чтобы сделать то, что было предложено Мори в его «специальном» решении, чтобы сделать условное выражение вокруг вызова отладчика, которое вы можете настроить внутри самого сеанса отладчика, чтобы избежать вызова 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
создания сценария, который устанавливает точку останова только при загрузке вашего сервера - черт возьми, вы можете написать целый фреймворк для управления модулем отладчика, как хотите. Конечно, если бы вы зашли так далеко, я бы просто создал одноэлементный класс, который поможет вам реализовать специальное решение Мори и будет вызывать или не вызывать оператор отладчика.
person
Matt
schedule
17.06.2011